终于开始配置 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/