MVVM和依赖注入

时间:2011-06-07 10:34:03

标签: c# mvvm unity-container

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

在我有的视图中:

private ViewModel vm;

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

    }

其中依赖属性告诉Unity注入此处。 ViewModel构造函数接受一个在Unity中注册的IQuoteSource对象:

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

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

感谢。

2 个答案:

答案 0 :(得分:6)

除了通过依赖注入解析视图对其ViewModel的依赖性之外,这与MVVM模式本身没有多大关系。

关于它是如何工作的,它非常简单。 DI有3个简单的概念:

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

第二个概念是 registration ,您注册对象所依赖的依赖项的实现(在您的情况下,您注册了IQuoteSource的实现)。请注意,您不必注册 ViewModel,因为它实际上并不是您所依赖的接口的实现。

第三个是将事物粘合在一起的东西,这是解析依赖,在那里你要求容器为你解析某种类型,然后它会查看对象声明的依赖项(在您的情况下,您正在解析依赖于MainWindow的{​​{1}}),找到正确的已注册的实施并解决它。此行为通过对象图解决方案级联(这解决了ViewModel对ViewModel的依赖性)。

希望这会有所帮助:)

答案 1 :(得分:0)

VM属性属于MainWindow吗?如果不是,我假设解析MainWindow启动某种解析级联,在某些时候包括创建在您的示例中具有VM属性的对象。

Unity检查它必须在级联中为[Dependency]修饰的属性解析的每个对象,并创建依赖属性类型的对象。当它创建这样的对象时,它会选择具有它知道如何创建的参数最多的构造函数,这是您注册IQuoteSource的地方 - &gt; RandomQuoteSource自带。

相关问题