【问题标题】:Unity container object resolution hierarchyUnity 容器对象解析层次结构
【发布时间】:2011-06-08 07:57:37
【问题描述】:

我的容器配置如下:

container = new UnityContainer()
            .RegisterType<IA, A>()
            .RegisterType<IB, B>()
            .RegisterType<IC, C>(new InjectionConstructor(strA));

我需要的是,我想注册另一个 C 实例,例如:

container.RegisterType<IC, C>(new InjectionConstructor(strB));

注意 strA 和 strB 之间的区别。

A 和 B 都需要 C。但我希望 A 使用第一个 C,B 使用第二个 C。

Unity 中是否有适当的方法来实现这一点?

谢谢

【问题讨论】:

  • 乍一看,strA 和 strB 应该是 A 和 B 上的一个属性,并由 C 传递/评估。
  • 我喜欢这样。这应该是正确的方法。

标签: c# dependency-injection unity-container containers


【解决方案1】:

你会想要使用named type registration

var container = new UnityContainer()
  .RegisterType<IC, C>("ForA", new InjectionConstructor(strA))
  .RegisterType<IC, C>("ForB", new InjectionConstructor(strB))

  .RegisterType<IA, A>(new InjectionConstructor(container.Resolve<IC>("ForA")))
  .RegisterType<IB, B>(new InjectionConstructor(container.Resolve<IC>("ForB")));

【讨论】:

    【解决方案2】:

    我过去通过装饰/外观通用接口以识别它们以进行映射来实现这一点。

    // new interface just for A
    public interface ICforA : IC { }
    
    // new interface just for B
    public interface ICforB : IC { }
    
    container = new UnityContainer()
               .RegisterType<IA, A>()
               .RegisterType<IB, B>()
               .RegisterType<ICforA, C>(new InjectionConstructor(strA));
               .RegisterType<ICforB, C>(new InjectionConstructor(strB));
    

    免责声明:代码是从内存而不是 Visual Studio 编写的。

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多