WPF/Prism:什么是UNITY容器?

for*_*yez 28 c# wpf prism

有人可以向我解释Unity容器的概念,比如我是一个6岁的孩子吗?它是如何工作的以及它的作用是什么?

Fem*_*ref 54

这是一个更加技术性的背景介绍,我希望你仍然觉得它很有用.

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

鉴于以下课程:

public class Sample
{
  Service a;

  public Sample()
  {
    a = new Service();
  }
}
Run Code Online (Sandbox Code Playgroud)

问题在于它初始化了自己的版本Service,因此很难调整代码更改(即,如果你想Service用不同的东西进行交换).它也使测试变得困难.

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

public class Sample
{
  Service a;

  public Sample(Service aService)
  {
    a = aService;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,您已经将创建从课堂上移除,您可以从外部将其放入其中,从而提高可测试性和可维护性.但是,您仍然依赖于该类Service.你对这个特定的类并不感兴趣,但是它提供的行为 - 所以你在界面中做出来.

public class Sample
{
  IService a;

  public Sample(IService aService)
  {
    a = aService;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

现在,Unity开始发挥作用.目前,您必须自己解决依赖关系.统一做的很简单 - 它需要所有具有依赖关系的类并解析那些 - 所以你可以调用(伪代码,我不知道统一):

UnityContainer uc = new UnityContainer();
var a = uc.GetService<IService>();
Run Code Online (Sandbox Code Playgroud)

它让你成为一个易于使用的课程.

我们对此有何看法?

  • 代码更易于维护,因为您不依赖于特定类型
  • 代码更可测试
  • 该应用程序很容易扩展

总结:它有助于更​​快地创建更好的应用程序.

  • 服务是否在添加到容器或调用 GetService 方法时被实例化?如果您在两个不同的地方请求相同的服务但​​来自同一个 Unity 实例,您会得到相同的对象还是不同的实例? (2认同)
  • 对不起,我不能告诉你,我以前从未使用过 Unity。一般来说,这取决于容器/框架的实现。看看文档,应该有关于这个的描述。此外,一些容器为您提供了定义生命周期契约的可能性,因此您可以为每个请求拥有单例实例(始终相同)或新实例。如前所述,完全取决于容器。 (2认同)

Tal*_*ner 37

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

每个cookie都有一些美德,比如你可以有一个饼干,但你不能吃它,因为它很难吃(像单身人士的东西)

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

  • 这似乎是一个6岁的答案.:) (20认同)
  • 在这个类比谁扮演妈妈的角色? (3认同)

ET.*_*ET. 7

我建议你观看Mike Taulty的Prism视频系列

前两章将回答你的问题,你可以看其他章节来学习棱镜(虽然它的版本2和相当陈旧,基本原理保持不变......)

祝好运 :)