在具体类型T的最简单情况下,Unity Resolve <t>()等于“new T”?

时间:2015-07-26 22:32:26

标签: .net dependency-injection unity-container prism

我是.Net Unity DI容器的新用户。在简单的Prism WPF示例代码中,我看到:

var shell = container.Resolve<Shell>();

其中Shell是具体类型,并且未在Unity中注册。这是否意味着上述语句只返回“new Shell()”?

1 个答案:

答案 0 :(得分:2)

如果&#39; Shell&#39;有一个默认的公共构造函数或一个非默认的构造函数,其构造函数参数为:

  1. 具体类型(默认构造函数或所有构造函数参数都可由容器解析)
  2. 是使用Unity注册的接口
  3. Unity能够构建一个Shell&#39;的实例。此过程称为“自动装配”。

    但最佳做法是在容器中注册所有依赖项。根据所有依赖关系,我指的是所有类型:

    1. 其他类型的构造函数参数
    2. 使用container.Resolve()
    3. 直接从容器中解析

      当你的计划加班时,如果不这样做,将会变得一团糟。有一段时间,以前的自动装配依赖将无法由容器构建,因为该组件现在依赖于某些其他无法解析的组件,从而在运行时破坏了应用程序。

      这样做的第二个原因是,有些容器可以verify your configuration,从而帮助您在过程的早期发现错误或错误配置。如果容器不知道所有组件,它将无法进行完整的验证。

      验证您的配置是有用的,因为使用DI容器的一个缺点是您错过了编译时支持,当您使用手工composition root(称为Pure DI时,您将获得该支持。 )。

      验证配置并不能保证无错误的应用程序,但它会带来编译时支持。

      注册所有类型也会消除DI容器的神奇功能,这有助于您了解容器的工作原理以及在更复杂的情况下应该做些什么。

      注册类型的另一个原因是,这使您可以控制组件的生命周期。如果您不想使用容器注册类型,容器将不知道使用哪个生命周期,从而使用其默认值注册组件。但这就是它变得棘手的地方。因为不同的容器具有不同的默认值。大多数容器默认为Transient(例如Simple Injector),而其他容器默认为Singleton(例如Castle Windsor)。这使得DI容器之间的切换变得困难且难以预测。