我应该在我的MVVM应用程序中使用Microsoft.Practices.Unity.IUnityContainer吗?

时间:2011-11-20 11:27:51

标签: 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(...,我们也会将RandomQouteSourceIQouteSource的实现相关联,但我不知道我清楚地了解以后应该如何使用它。

问题是:

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

4 个答案:

答案 0 :(得分:7)

应该你?

这取决于你。它可能很复杂。如果您正确使用它,那么对于您的代码以及您对代码如何工作的了解都是值得的。

您将能够识别应用程序中仅应与臂部长度接触的部件。您可以更自由地更改代码,而不会影响代码的其他部分。您还可以更轻松地创建使用模拟对象的单元测试,但这只是一个附带的好处。

您必须阅读有关此主题的一些文章,看看它是否对您有意义。

(公平地说,它确实并不复杂 - 当你正在学习它时,或者当你试图向那些不熟悉这些概念的人解释它时) EM>

团结和依赖注入

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

它可以与Mark Seemann's book on Dependency Injection in .Net框架结合使用,以便在WPF / Silverlight中使用。

依赖注入有许多规则,您需要遵循这些规则才能获得最大收益。我没有在Unity的网站上看到简单或有效的“入门”指南,并且https://github.com/ninject/ninject/wiki/Getting-Started不是免费的。

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

这不是Unity框架,因此代码不会直接编译......

...但它应该教你依赖注入的基础知识,以及为什么要使用它。然后,您应该可以关注Unity页面上的videosan article on the three calls pattern for yet-another DI container library

如果你跳过这些步骤,你会很快感到困惑,并且可能会在脚上射击至少几十次。

创建Windows

除了那个功能外,你不使用容器。在其他任何地方使用它,并且您没有正确使用DI容器。您只需使用容器注册视图,查看模型和模型,解析您之前注册的主窗口,并在完成后处置容器。

此过程称为“三个呼叫模式”。不幸的是,我没有Unity的任何通用示例,但这里是{{3}}。

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

答案 1 :(得分:0)

这是一项众所周知的技术,名为Dependency Injection

替代方法是手工创建所需的依赖。

您可以从codeplex下载patterns & practices - Unity的统一集。

查看codeproject article获取教程。

我没有使用过wpf,但我会采用相同的方式来最小化依赖关系 并获得更好的可测试性。

修改

以下是codeplex的另一个例子。

但是读取这个article from here stack 第一次,导致它似乎很痛苦

答案 2 :(得分:0)

使用依赖注入通常是一种很好的做法。它让你的课程担心自己的问题,让框架担心管理依赖关系。这会在您的课程中产生更专注,更易于维护和更可测试的代码。统一只是众多此类框架中的一种,可以说有更好的其他框架,例如结构图和城堡windsor。使用容器基本上意味着在一个地方设置一个注册表,您可以使用它们的依赖关系来解析您的类,并且您的类在其构造函数中指定,或者使用公共属性指定它们所依赖的内容。如果您从容器中解析一个类,它将根据依赖类型根据该类型在容器中的注册方式自动解析其依赖关系。

在项目中包含统一性的最简单方法是使用nuget。刚问题:install-package unity。您还可以下载二进制文件和源代码,并在codeplex项目中获取更多信息以获得统一:http://unity.codeplex.com/

答案 3 :(得分:0)

一个建议是Ninject - 一个轻量级,易于使用的DI工具。