c# - Unity - 为同一个接口(interface)注入(inject)不同的类

标签 c# inversion-of-control unity-container

我有一个接口(interface):IFoo
实现该接口(interface)的两个类:FooOneFooTwo
还有两个类 ClassOneClassTwo 在构造函数中接收一个 IFoo 参数。

我如何配置 unity 以便 ClassOne 接收一个 FooOne 实例并且 ClassTwo 仅使用一个容器接收一个 FooTwo

我不能在运行时做,所以它必须在配置文件中。

最佳答案

看看 Unity documentation .

要获得更具可读性的配置文件,您应该为 IFooFooOneFooTwoClassOne 定义类型别名和 ClassTwo。然后你需要注册从 IFoo 到你的实现的映射。您需要为映射设置一个名称。 对于 IFoo 的消费者,您需要注册一个 InjectionConstructor

你的配置看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
      Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IFoo" type="UnityConfigFile.IFoo, UnityConfigFile" />
    <alias alias="FooOne" type="UnityConfigFile.FooOne, UnityConfigFile" />
    <alias alias="FooTwo" type="UnityConfigFile.FooTwo, UnityConfigFile" />
    <alias alias="ClassOne" type="UnityConfigFile.ClassOne, UnityConfigFile" />
    <alias alias="ClassTwo" type="UnityConfigFile.ClassTwo, UnityConfigFile" />
    <container>
      <register type="IFoo" name="1" mapTo="FooOne" />
      <register type="IFoo" name="2" mapTo="FooTwo" />
      <register type="ClassOne" mapTo="ClassOne">
        <constructor>
          <param name="foo">
            <dependency type="IFoo" name="1" />
          </param>
        </constructor>
      </register>
      <register type="ClassTwo" mapTo="ClassTwo">
        <constructor>
          <param name="foo">
            <dependency type="IFoo" name="2" />
          </param>
        </constructor>
      </register>
    </container>
  </unity>
</configuration>

这是显示其工作原理的相应测试。

UnityConfigurationSection config =
  (UnityConfigurationSection) ConfigurationManager.GetSection("unity");
IUnityContainer container = new UnityContainer();
container.LoadConfiguration(config);
ClassTwo two = container.Resolve<ClassTwo>();
Assert.IsInstanceOfType(two.Foo, typeof(FooTwo));

更新

在运行时你可以这样做

IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, FooOne>("One");
container.RegisterType<IFoo, FooTwo>("Two");
container.RegisterType<ClassOne>(new InjectionConstructor(
  new ResolvedParameter<IFoo>("One")));
container.RegisterType<ClassTwo>(new InjectionConstructor(
  new ResolvedParameter<IFoo>("Two")));

关于c# - Unity - 为同一个接口(interface)注入(inject)不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130637/

相关文章:

带有附加 Windows 服务的 C# Windows 窗体

c# - 在 C# 中需要有关正则表达式和模式匹配的帮助吗?

c# - 使用 IoC 容器时,如何将动态数据/对象传递给类?

c# - 你如何调和 IDisposable 和 IoC?

c# - 如何在Winform中使用Unity DI?

c# - 无法在 Windows Server 2016/IIS 10 上获取 IIS 拾取目录

javascript - 使用 Javascript 加密数据,使用私钥/公钥解密 C# 中的数据

c# - 难以通过工厂 DI 理解 ninject(或一般的 IOC 容器)?

c# - 将抽象工厂与 StructureMap 一起使用的可能性