我应该使用Unity Config文件或代码来注册类型和实例吗?

时间:2011-09-28 14:33:42

标签: c# asp.net inversion-of-control unity-container ioc-container

最后开始配置IoC容器!

我正在使用Unity并将其配置为使用配置文件注册我的对象:

e.g。

      <container>
        <register type="ILogger" mapTo="Logger">
          <lifetime type="singleton"/>
        </register>
        <register type="IPdfWriter" mapTo="PdfWriter">
          <lifetime type="perthread" />
          <constructor />      
        </register>
</container>

我已经达到了这样的程度,我怀疑这是一种注册类型的好方法。

例如,我的一个类依赖于Microsoft Enterprise Library Caching块中的ICacheManager,并且应该向它注入以下内容:

EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>()

并且仅使用统一配置设置似乎不可能。

在我看来,使用代码而不是配置文件注册类型总是更好。

您对此有何体验/建议?

由于

5 个答案:

答案 0 :(得分:4)

答案是 - 您认为部署后需要更改配置吗?如果是这样,请使用配置文件。如果没有,我发现在代码中这样做更容易。

要回答你没有问过的问题 - 你想要做的事实上是可行的,而且很容易。诀窍是为Enterprise Library和其他所有内容使用相同的容器实例。在您的启动代码中,设置Unity容器实例,并将EnterpriseLibraryCoreExtension添加到它(您可以在配置中执行)。然后将该容器设置为EnterpriseLibraryContainer.Current。完成后,您可以拥有一个依赖于ICacheManager的类型,其他一切都可以正常工作。

这样的事情:

在XML配置中:

<unity>
  <namespace name="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity" />
  <assembly name="Microsoft.Practices.EnterpriseLibrary.Common" />

  <container>
    <extension type="EnterpriseLibraryCoreExtension" />

    <register type="IMyType" mapTo="MyImplementation">
      <constructor>
        <param name="cacheManager" />
      </constructor>
    </register>
  </container>
</unity>

(你当然也需要你的entlib配置。)

然后在启动应用程序时,请使用以下代码:

var container = new UnityContainer()
    .LoadConfiguration();

EnterpriseLibraryContainer.Current = new UnityServiceLocator(container);

从那里一切都应该起作用。 EnterpriseLibraryContainer.Current将从容器中获取对象,从容器中解析的对象将像任何其他依赖项一样注入entlib对象。

完成此步骤后,下一步是通过DI获取所有entlib对象,并将显式调用放到EnterpriseLibraryContainer.Current。

答案 1 :(得分:2)

根据我的经验,使用C#比xml更具表现力和动态。但是,您可能希望能够在运行时更改设置的某些部分,然后您可以执行这两项操作。您可以使用配置和代码来设置容器。

答案 2 :(得分:2)

如果您希望在生产计算机(例如客户端的Web服务器)上切换组件实现,那么您应该使用配置文件。

如果您只是使用Unity来简化测试/减少或删除依赖项,并且不希望在生产计算机上更换部件,那么在代码中将其旋转就可以了。

答案 3 :(得分:2)

到目前为止一些好的答案。

还有第三种选择:同时使用两者。当你配置两次相同的东西时,第二个定义会覆盖第一个。这意味着您可以在设计时在代码中配置一组合理的默认值,然后从xml加载运行时更新。

还要记住,类上的属性是用于定义拦截调用处理程序的选项。这可以从您的策略中删除整个部分,无论是xml还是C#。

答案 4 :(得分:0)

正如其他人所说:使用配置方法可以使代码在切换类型方面非常灵活,而无需更改代码。

缺点是让你自己接受打字错误,如果你有大量的注册,需要一段时间来追查。我时不时地经常看到一个胖胖的开发者错误地输入了一个类名,这导致了大约三十分钟左右的头部刮伤!

个人使用这两种方法我更喜欢编码惯例。但如果我在一个真正需要动态的项目上,那就去配置吧!