c# - 我应该使用 Unity Config 文件还是代码来注册类型和实例?

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

终于开始配置 IoC 容器了!

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

例如

      <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 block 中的 ICacheManager,应该向其注入(inject)以下内容:

EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>()

这似乎无法仅使用统一配置设置。

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

您对此有何经验/建议?

谢谢

最佳答案

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

然后回答您没有提出的问题 - 您想要做的事情实际上是可能的,而且非常容易。诀窍是为 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 将从您的容器获取对象,从容器解析的对象将像任何其他依赖项一样注入(inject) entlib 对象。

完成这一步后,下一步就是通过 DI 获取所有 entlib 对象并放弃对 EnterpriseLibraryContainer.Current 的显式调用。

关于c# - 我应该使用 Unity Config 文件还是代码来注册类型和实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584911/

相关文章:

c# - 工具包图表旋转标签 X 轴

c# - 是否有检测 ASP.NET 的指令?

c# - 为什么 JS 调用点击按钮后 IE 不刷新页面?

asp.net-mvc - mvc 5 应用程序可以开箱即用 IoC 吗?

.net - 在 ASP.MVC 3 中使用 DI 和 IoC 如何设置我的 Controller 以正确解析新类型?

c# - SignalR 集线器客户端在触发事件时为空

c# - 如何在自定义事件参数中传递 View 模型

c# smtp发送问题?

c# - ASP.NET MVC 哈希符号在参数中被忽略

c# - 接口(interface)如何实现功能?