MVVM和依赖注入

6

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

在View中,我有:

private ViewModel vm;

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

    }

其中的dependency属性告诉Unity在这里进行注入。ViewModel构造函数需要一个IQuoteSource对象,该对象已在Unity中注册:

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

这是如何工作的呢?因为我从未使用上面的属性显式地创建ViewModel对象。如果是在Unity中处理的,那么它是如何实现的呢?

谢谢。

2个回答

6
这与MVVM模式本身没有多大关系,除了视图通过依赖注入解决其对ViewModel的依赖关系之外。
关于它的工作原理,非常简单。 DI有三个简单的概念:
第一个是声明依赖项,其中某些对象通过构造函数或属性指定它们依赖于某些内容(在您的示例中使用DependencyAttribute)。
第二个概念是注册,其中您注册对象所具有的依赖项的实现(在您的情况下,您注册了IQuoteSource的实现)。请注意,您不必注册ViewModel,因为它实际上不是您所依赖的接口的实现。
第三个是将所有内容粘合在一起的东西,即解析依赖项,您要求容器为您解析某种类型,它会查看该对象声明的依赖项(在您的情况下,您正在解析MainWindow,它依赖于ViewModel),找到正确的已注册实现并解析它。此行为会贯穿整个对象图的解析过程(解析ViewModel对IQuoteSource的依赖项)。
希望这可以帮助您 :)

0

VM属性属于MainWindow吗?如果不是,我假设解析MainWindow会启动某种解析级联,该级联在某个时刻包括创建具有VM属性的对象。

Unity检查级联中需要解析的每个对象,以查找用[Dependency]装饰的属性,并创建依赖属性类型的对象。当它创建这样的对象时,它选择具有最多参数的构造函数,它知道如何创建,这就是您注册IQuoteSource -> RandomQuoteSource的地方。


嗨,是的,VM是MainWindow的一个属性。谢谢。 - Darren Young

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