2011-01-06 64 views
26

有人可以向我解释一个Unity容器的概念,就像我是一个6岁的孩子吗?它是如何工作的?它有什么作用?WPF/Prism:什么是UNITY容器?

+2

这不是说有一个Unity容器,而是'Unity'是一个特定的依赖注入(DI)容器的名称。棱镜也附带MEF并支持任何其他DI容器。 Unity刚刚排在第一位。如果您想了解Unity和MEF之间的区别,请阅读http://msdn.microsoft.com/en-us/library/ff921140(v=PandP.40).aspx上的相关章节。 – Pat 2011-01-06 18:37:17

+0

@Pat,MEF是一个插件框架,而Unity是一个真正的DI容器。 – 2013-03-15 00:17:41

回答

47

这是一个更为技术性的背景描述,我希望你仍然觉得它很有用。

一般来说,它是一个DI(依赖注入)容器。

考虑下面的类:

public class Sample 
{ 
    Service a; 

    public Sample() 
    { 
    a = new Service(); 
    } 
} 

但问题是,它初始化它自己的Service版本,使得它很难调整代码更改(例如,如果你想要的东西交换Service。不同)。它也使测试变得困难。

要解决的是,并没有真正自己创建它,而是从外面得到它:

public class Sample 
{ 
    Service a; 

    public Sample(Service aService) 
    { 
    a = aService; 
    } 
} 

现在你已经采取了创作远离类你可以把它放在那里从外面,增加可测试性和可维护性。但是,您仍然对类Service有依赖性。你并不是真的对那个特定的课程感兴趣,而是对它提供的行为感兴趣 - 所以你在界面中做出来。

public class Sample 
{ 
    IService a; 

    public Sample(IService aService) 
    { 
    a = aService; 
    } 
} 

现在,你可以用你喜欢的任何东西来替换服务。例如,您有一个班级使用服务从服务器获取数据。现在,您只想测试数据解析,而不是数据获取服务 - 只需创建一个实现接口的类,提供静态数据 - 完成!

现在,Unity开始发挥作用。目前,你必须自己解决依赖关系。什么团结确实很简单 - 它需要有dependendencies所有类和解决这些 - 所以你可以调用(伪代码,我不知道团结):

UnityContainer uc = new UnityContainer(); 
var a = uc.GetService<IService>(); 

而且它可以让你的随时可用类。

我们对此有何评论?

  • 代码更易于维护,因为你不依赖于特定类型的
  • 代码的可测试性
  • 应用是易于扩展

作为总结:它有助于创造更好应用更快。

33

Unity Container就像一个装满了cookies的罐子,当你需要一个cookie时,你只需要问jar给你一个cookie。

每个cookie是有一些优点一样,你可以有一个cookie,而是因为它是很难吃的(类似单)

当你的妈妈会创建一个新的cookie

,她只是把你不能吃在罐子里的饼干,而不是直接给你!

+16

,这似乎是一个6岁的答案。 :) – 2011-01-06 06:03:25

7

我建议你看Mike Taulty's Prism video series

前两章会回答你的问题,你可以观看其他章节学习棱镜(尽管其2和比较老的版本,基本原理是一样的.. )

祝你好运:)