c# - 我应该在我的 MVVM 应用程序中使用 Microsoft.Practicies.Unity.IUnityContainer 吗?

标签 c# wpf mvvm dependency-injection unity-container

Jason Dolinger 在他位于此处的视频(现在很热门)www.lab49.com/files/videos/Jason%20Dolinger%20MVVM.wmv(从 0.59 到 1.04)中使用了这样的代码:

public partial App: Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        IUnityContainer container = new UnityContainer();
        RandomQuoteSource source = new RandomQuoteSource();
        container.RegisterInstance<IQuoteSource>(source);

        WatchList window = container.Resolve<WatchList>();
        window.Show();
    }
}

他使用我找不到的 IUnityContainer 类。据我了解,我们只是创建了一个窗口(因此 container.Resolve 调用可以替换为 new WatchList(...,我们还以某种方式关联了 RandomQouteSource 作为 IQouteSource 的实现,但是我不清楚以后应该如何使用它。

问题是:

  • 如何在 MVVM 应用程序中创建主窗口,是否也为此使用 IUnityContainer?
  • 总体来说技术好吗?它是众所周知的吗?这是做这些事情的默认方式吗?我有什么选择?
  • 在哪里可以找到 Microsoft.Practicies.Unity.dll?

最佳答案

你应该吗?

这取决于你。它可能很复杂。如果您正确使用它,无论是对于您的代码还是对于您对代码工作原理的了解,它都是值得的。

您将能够识别您的应用程序中哪些部分应该只与其他部分保持一定距离。您可以更自由地更改代码,而不会影响代码的其他部分。您还可以更轻松地创建使用模拟对象的单元测试,但这只是附带的好处。

你必须阅读一些关于这个主题的文章,看看它是否对你有意义。

(公平地说,它真的并不复杂 - 在您学习它时,或者在您尝试向不熟悉这些概念的人解释它时,它看起来就是这样)

统一和依赖注入(inject)

IUnityContainerUnity 的一部分,这是一个 Dependency Injection容器库。

它可以与 PRISM 结合使用在 WPF/Silverlight 中使用的框架。

依赖注入(inject)有很多规则,您需要遵循这些规则才能获得最大 yield 。我在 Unity 的网站上没有看到简单或有效的“入门”指南,并且 Mark Seemann's book on Dependency Injection in .Net不是免费的。

所以我建议您在一个有很好教程的网站上查看有关依赖注入(inject)的介绍教程:

这不是Unity框架,所以代码不会直接编译...

...但它应该教会您什么是依赖注入(inject)的基础知识,以及您为什么要使用它。那么你应该可以关注 sample codevideos在 Unity 页面上。

如果您跳过这些步骤,您很快就会感到困惑,并且可能至少搬起石头砸自己的脚几十次。

创建窗口

除了在那个函数中,你不使用容器。在其他任何地方使用它,并且您没有正确使用 DI 容器。您只需使用容器来注册您的 View 、 View 模型和模型,解析您之前注册的主窗口,并在完成后释放容器。

此过程称为“三次调用模式”。不幸的是,我没有任何适用于 Unity 的通用示例,但这里是 an article on the three calls pattern for yet-another DI container library .

您可能还会在我上面链接的 Ninject 教程中看到这一点。

关于c# - 我应该在我的 MVVM 应用程序中使用 Microsoft.Practicies.Unity.IUnityContainer 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8201197/

相关文章:

c# - 如何调试 soap web 服务?

.net - 您用什么来创建和打印表格/文档?

silverlight - Silverlight3中MVVM绑定(bind)ItemsControl获取父控件DataContext

wpf - 如何在 WPF 中更改 DynamicResource

android - 用特定于UI的数据增强PagedList且不破坏MVVM模式的最佳方法

c# - 在 Entity Framework Core 中创建迁移时如何配置 DbContext?

c# - WinForms CheckedListBox勾选项数的确定

c# - MSBuild 自动更正变量定义而不被告知

c# - 如何在 ListCollectionView 中进行搜索?

c# - WPF,列表框中没有显示任何内容