我目前正在学习 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)的实现。
第三个是将事物粘合在一起的东西,即解析依赖关系,您要求容器为您解析某种类型,它会查看对象声明的依赖关系(在您的情况下,您正在解析依赖于 ViewModel
的 MainWindow
),找到正确的已注册实现并解决它。此行为通过对象图的解析级联(解析 ViewModel 对 IQuoteSource
的依赖性)。
希望这有帮助:)
关于c# - MVVM 和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6263974/