我目前正在学习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中处理,如果是这样,它是如何实现的呢?
感谢。
答案 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自带。