C# WPF/Prism:什么是UNITY容器?

C# WPF/Prism:什么是UNITY容器?,c#,wpf,prism,C#,Wpf,Prism,有人能像我是一个6岁的孩子一样向我解释一下Unity容器的概念吗?Unity容器就像一个装满饼干的罐子,当你需要一块饼干时,你只要让罐子给你一块饼干就行了 每一块饼干都有一些优点,比如你可以吃一块饼干,但你不能吃它,因为它很难吃(比如singleton) 当你妈妈创造了一个新的饼干,她只是把饼干放在罐子里,而不是直接给你 这是对背景的更技术性的描述,我希望您仍然觉得它有用 一般来说,它是一个DI(依赖注入)容器 鉴于以下类别: public class Sample { Service a;

有人能像我是一个6岁的孩子一样向我解释一下Unity容器的概念吗?Unity容器就像一个装满饼干的罐子,当你需要一块饼干时,你只要让罐子给你一块饼干就行了

每一块饼干都有一些优点,比如你可以吃一块饼干,但你不能吃它,因为它很难吃(比如singleton)


当你妈妈创造了一个新的饼干,她只是把饼干放在罐子里,而不是直接给你

这是对背景的更技术性的描述,我希望您仍然觉得它有用

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

鉴于以下类别:

public class Sample
{
  Service a;

  public Sample()
  {
    a = new Service();
  }
}
问题是它初始化了自己的
服务版本
,因此很难调整代码更改(即,如果您想用不同的东西交换
服务
)。这也使得测试变得困难

要解决这个问题,不要亲自创建,而是从外部获取:

public class Sample
{
  Service a;

  public Sample(Service aService)
  {
    a = aService;
  }
}
现在,您已经将创建从类中移除,您可以从外部将其放入其中,从而提高可测试性和可维护性。但是,您仍然依赖于类
服务
。您对那个特定的类并不感兴趣,而是对它提供的行为感兴趣——因此您可以在接口中使用它

public class Sample
{
  IService a;

  public Sample(IService aService)
  {
    a = aService;
  }
}
现在,你可以用任何你喜欢的东西来替换服务。例如,您有一个使用服务从服务器获取数据的类。现在,您只想测试数据解析,而不想测试数据获取服务-只需创建一个实现接口的类,为静态数据提供服务-完成

现在,团结开始发挥作用。目前,您必须自己解决依赖关系。unity所做的很简单-它接受所有具有依赖关系的类并解析它们-因此您可以调用(伪代码,我不知道unity):

UnityContainer uc=newunitycontainer();
var a=uc.GetService();
它为您提供了易于使用的类

那我们有什么收获

  • 代码更易于维护,因为您不依赖于特定类型
  • 代码更易于测试
  • 该应用程序易于扩展
总而言之:它有助于更快地创建更好的应用程序。

我建议您观看

前两章将回答您的问题,您可以通过观看其他章节来学习Prism(尽管它的版本2非常旧,但基本原则仍然相同…)


祝你好运:)

这似乎是一个6岁孩子的回答在这个类比中,谁扮演了mom的角色?一个实现服务的模块(插件)。与其说有一个Unity容器,不如说“Unity”是一个特定依赖注入(DI)容器的名称。Prism还附带MEF并支持任何其他DI容器。团结才是第一位的。如果您想了解Unity和MEF之间的区别,请阅读相关章节。@Pat,MEF是一个插件框架,而Unity是一个真正的DI容器。该服务是在添加到容器中还是在调用GetService方法时得到实例化的?如果你在两个不同的地方要求相同的服务,但是从同一个Unity实例你会得到相同的对象还是不同的实例?对不起,我不能告诉你,我以前从未使用过Unity。一般来说,这取决于容器/框架的实现。看看文档,应该有一个描述。此外,一些容器还提供了定义生存期契约的可能性,因此可以为每个请求提供单例实例(始终获得相同的)或新实例。如前所述,这完全取决于容器。好的,我已经阅读了Unity手册的部分内容,这似乎是非常可配置的,所以我想你可以随心所欲。@IngóVals,我相信你现在已经发现Unity允许“在两个不同的地方提供相同服务”的一些变体,其中一个是Singleton,因此你可以得到“同一个对象”,另一个是每个实例,将返回“单独的实例”。像往常一样,这取决于您如何配置它。我7岁的孩子不理解这个答案;P
UnityContainer uc = new UnityContainer();
var a = uc.GetService<IService>();