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

C# 我应该使用Unity配置文件或代码来注册类型和实例吗?,c#,asp.net,inversion-of-control,unity-container,ioc-container,C#,Asp.net,Inversion Of Control,Unity Container,Ioc Container,终于开始配置IoC容器了 我正在使用Unity,并已将其配置为使用配置文件注册我的对象: e、 g 我已经到了怀疑这是注册类型的好方法的地步 例如,我的一个类依赖于Microsoft Enterprise Library缓存块中的ICacheManager,应向其注入以下内容: EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>() EnterpriseLibraryContainer.Current.Ge

终于开始配置IoC容器了

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

e、 g


我已经到了怀疑这是注册类型的好方法的地步

例如,我的一个类依赖于Microsoft Enterprise Library缓存块中的ICacheManager,应向其注入以下内容:

EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>()
EnterpriseLibraryContainer.Current.GetInstance()
仅仅使用unity配置设置似乎是不可能的

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

你在这方面有什么经验/建议


谢谢

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

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

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


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

如果您希望在生产机器(如客户机的web服务器)上更换组件实现然后您应该使用一个配置文件


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

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

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

大概是这样的:

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

EnterpriseLibraryContainer.Current = new UnityServiceLocator(container);
在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>
从那以后,一切都应该正常运转。EnterpriseLibraryContainer.Current将从容器中获取对象,从容器中解析的对象将像任何其他依赖项一样获取entlib对象


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

答案是-部署后是否需要更改配置?如果是,请使用配置文件。如果没有,我发现在代码中做起来更容易

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

大概是这样的:

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

EnterpriseLibraryContainer.Current = new UnityServiceLocator(container);
在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>
从那以后,一切都应该正常运转。EnterpriseLibraryContainer.Current将从容器中获取对象,从容器中解析的对象将像任何其他依赖项一样获取entlib对象


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

到目前为止,有一些不错的答案

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


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

到目前为止,有一些不错的答案

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


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

正如其他人所说:使用配置方法可以在不更改代码的情况下使代码在切换类型方面具有极大的灵活性

不利的一面是,如果你有大量的注册,你可能会遇到打字错误,需要一段时间才能找到。时不时我会看到一个笨手笨脚的开发人员输入了一个类名,这会导致长达30分钟左右的挠头


就我个人而言,使用这两种方法后,我更喜欢编码约定。但如果我在一个真正需要动态的项目上,那么就进行配置吧

正如其他人所说:使用配置方法使代码在不改变代码的情况下切换类型非常灵活

不利的一面是让自己敞开心扉