【问题标题】:Understanding Unity and Dependency Injection with MVVM and Prism使用 MVVM 和 Prism 理解 Unity 和依赖注入
【发布时间】:2015-04-20 06:07:33
【问题描述】:

我已经开始将 Microsoft 的 Prism 框架与 Unity 一起用于 WPF 应用程序,主要是为了自学一些新概念。

我一直在尝试了解依赖注入以及如何将 Unity 与我的视图模型一起使用,但我对自己所做的事情没有足够的把握,甚至无法真正问自己做错了什么。

因此,我将介绍我所处的场景,希望有人能帮助我了解我哪里出错了。

让我们考虑一个 EventAggregator 场景,其中 ModuleA 发布,ModuleB 订阅。在我的 ModuleA MainWindowViewModel 中,我会有一个像这样的类构造函数:

private IEventAggregator _eventAggregator;
public MainWindowViewModel(IEventAggregator eventAggregator) {
    _eventAggregator = eventAggregator;
    ...
}

现在,当我注册我的 ModuleA MainWindowView 时,我会这样做:

public class ModuleA {
    private readonly IRegionManager _regionManager;
    public ModuleA(IRegionManager regionManager) {
        _regionManager = regionManager;
    }

    public void Initialize() {
        _regionManager.RegisterViewWithRegion("SomeRegion", typeof(MainWindowView));
    }
}

然后,在我的项目的Bootstrapper.cs 中,我将创建我的ModuleCatalog

public class Bootstrapper {
    ...
    protected override void ConfigureModuleCatalog() {
        base.ConfigureModuleCatalog();
        ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;

        moduleCatalog.AddModule(typeof(ModuleA.ModuleA));
        ...
    }
}

现在,我可以使用ServiceLocator 在我的 ViewModel 中实例化我的eventAggregator,但我正在尝试通过依赖注入来实现,用IUnityContainer 注册我的 ViewModel,然后根据需要注入我的 View。此外,我一直认为我实际上应该为我的 ViewModel 使用一个接口(即IMainWindowViewModel)来分离关注点。

有人能给我指出一个可能能够消除我明显困惑的资源吗?我已经阅读了 MSDN 的 Prism QuickStarts,包括 Advanced MVVM Scenarios,但我不明白如何将说明置于上下文中。

【问题讨论】:

    标签: c# wpf mvvm dependency-injection unity-container


    【解决方案1】:
    1. 现在,我可以使用ServiceLocator 在我的ViewModel 中实例化我的eventAggregator,但我正在尝试通过依赖注入来实现,用IUnityContainer 注册我的ViewModel,然后注入我的@ 987654328@如有需要。

      上面提到了两种不同的机制:

      服务定位器与依赖注入

      基本的选择是在服务定位器和依赖注入之间。第一点是,这两种实现都提供了简单示例中缺少的基本解耦——在这两种情况下,应用程序代码都独立于服务接口的具体实现。两种模式之间的重要区别在于如何将该实现提供给应用程序类。使用服务定位器,应用程序类会通过给定位器的消息明确地请求它。注入没有显式请求,服务出现在应用程序类中 - 因此控制反转。

      -- Inversion of Control Containers and the Dependency Injection pattern, Martin Fowler.

      结论。必须有一个架构决策:“使用哪种机制?”。

    2. 此外,我一直认为我实际上应该为我的ViewModel(即IMainWindowViewModel)使用一个接口来分离关注点。

      这就是依赖倒置原则的应用方式。

      依赖倒置原则:

      A.高级模块不应依赖于低级模块。两者都应该依赖于抽象。

      B.抽象不应依赖于细节。细节应该取决于抽象。

      -- The Dependency Inversion Principle, Robert C. Martin, 1996.

      “Details”是具体类型,“Abstractions”是接口。

    有关详细信息,请参阅引用的参考文献。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多