c# - MVVM 和依赖注入(inject)

标签 c# mvvm unity-container

我目前正在学习 MVVM 模式,我正在学习的教程使用 Unity 进行 DI。我以前并没有真正以这种方式使用过 DI,只是想澄清一下我对这段特定代码如何工作的想法。

在我的 View 中:

private ViewModel vm;

    [Dependency]
    public ViewModel VM
    {
        set
        {
            vm = value;
            this.DataContext = vm;
        }

    }

依赖属性告诉 Unity 在此处注入(inject)。 ViewModel 构造函数采用在 Unity 中注册的 IQuoteSource 对象:

        IUnityContainer container = new UnityContainer();
        RandomQuoteSource randomQuoteSource = new RandomQuoteSource();
        container.RegisterInstance<IQuoteSource>(randomQuoteSource);
        MainWindow window = container.Resolve<MainWindow>();
        window.Show();

这是如何工作的,因为我从来没有使用上面的属性显式创建 ViewModel 的对象。这一切都在 Unity 中处理吗?如果是,它是如何实现的?

谢谢。

最佳答案

这与 MVVM 模式本身没有太大关系,除了 View 对其 ViewModel 的依赖是通过依赖注入(inject)解决的。

它的工作原理非常简单。 DI 有 3 个简单的概念:

第一个是声明一个依赖项,其中一些对象通过构造函数或属性指定它依赖于某些东西(在您的示例中就是这种情况,使用 DependencyAttribute)。

第二个概念是注册,您可以在其中注册一个实现您的对象所具有的依赖项(在您的例子中,您注册了一个IQuoteSource)。请注意,您不必注册 ViewModel,因为它实际上并不是您所依赖的接口(interface)的实现。

第三个是将事物粘合在一起的东西,即解析依赖关系,您要求容器为您解析某种类型,它会查看对象声明的依赖关系(在您的情况下,您正在解析依赖于 ViewModelMainWindow),找到正确的已注册实现并解决它。此行为通过对象图的解析级联(解析 ViewModel 对 IQuoteSource 的依赖性)。

希望这有帮助:)

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

相关文章:

c# - 如何使用c#移动到word中的下一部分

c# - ASP.NET:何时以及如何在代码后面动态更改 Gridview header 文本?

android - MVI 与 MVC 和 MVVM 相比有什么区别

c# - C# 中 HtmlDocument 引用的 NullReferenceException

unity-container - 如何使用统一根据注入(inject)的类型有条件地绑定(bind)实例?

c# - 按字母顺序过滤 Active Directory 用户

c# - MVC 在后 ActionResult 中获取表单控件数据属性值

wpf - 为什么 ListCollectionView.CustomSort 这么慢?

c# - 在 Xamarin.Forms 中使用 MVVM 进行页面导航

unity-container - 使用 Unity 注册 Automapper