使用MVVM和Prism理解Unity和依赖注入

3
我开始在WPF应用程序中使用Microsoft的Prism框架与Unity,主要是为了学习一些新概念。
我一直在尝试理解依赖注入以及如何将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,但我正在尝试通过依赖注入来完成这个过程,通过将我的ViewModel注册到IUnityContainer,然后根据需要注入我的View。此外,我一直看到应该为我的ViewModel使用一个接口(即IMainWindowViewModel)来分离关注点。

请问是否有资源可以帮助我消除明显的困惑?我已经阅读了MSDN的Prism QuickStarts,包括高级MVVM场景,但我不知道如何将说明情境化。
1个回答

0
  1. 现在,我可以使用 ServiceLocator 在我的 ViewModel 中实例化我的 eventAggregator,但我正在尝试通过依赖注入来完成它,将我的 ViewModel 注册到一个 IUnityContainer 中,然后根据需要注入我的 View

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

    服务定位器 vs 依赖注入

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

    -- 控制反转容器和依赖注入模式,Martin Fowler

    结论。必须做出架构决策:“使用哪种机制?”。

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

    这就是应用依赖反转原则的方式。

    依赖反转原则:

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

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

    -- 依赖反转原则,Robert C. Martin, 1996

    其中“细节”是具体类型,“抽象”是接口。

请参考引用的参考资料获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接