gpt4 book ai didi

c# - 使用 MVVM 和 Prism 了解 Unity 和依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 18:25:44 27 4
gpt4 key购买 nike

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

我一直在努力理解依赖注入(inject)以及如何将 Unity 与我的 View 模型一起使用,但我对我正在做的事情没有足够的把握,甚至没有真正问我做错了什么。

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

让我们考虑一个 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,但我正在尝试通过依赖注入(inject)来实现,使用 注册我的 ViewModel >IUnityContainer 然后根据需要注入(inject)我的 View 。此外,我一直认为我实际上应该为我的 ViewModel 使用一个接口(interface)(即 IMainWindowViewModel)来分离问题。

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

最佳答案

  1. Now, I could use ServiceLocator to instantiate my eventAggregator in my ViewModel, but I'm trying to do it via Dependency Injection, registering my ViewModel with an IUnityContainer and then injecting my View as necessary.

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

    Service Locator vs Dependency Injection

    The fundamental choice is between Service Locator and Dependency Injection. The first point is that both implementations provide the fundamental decoupling that's missing in the naive example - in both cases application code is independent of the concrete implementation of the service interface. The important difference between the two patterns is about how that implementation is provided to the application class. With service locator the application class asks for it explicitly by a message to the locator. With injection there is no explicit request, the service appears in the application class - hence the inversion of control.

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

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

  2. Furthermore, I keep seeing that I should actually be using an interface for my ViewModel (i.e. IMainWindowViewModel) to separate concerns.

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

    The Dependency Inversion Principle:

    A. High level modules should not depend upon low level modules. Both should depend upon abstraction.

    B. Abstractions should not depend upon details. Details should depend upon abstractions.

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

    “细节”是具体类型,“抽象”是接口(interface)。

有关详细信息,请参阅引用的引用资料。

关于c# - 使用 MVVM 和 Prism 了解 Unity 和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29740359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com