有没有办法传播多次注射?

时间:2016-06-14 20:08:08

标签: c# ninject

我试图让Ninject解析一个依赖关系树,要求它创建多个对象,具体取决于依赖关系的绑定数量。

例如,假设我有这种类型的系统:

public class A : IA
{
    public A(IB[] bs) { /* ... */ }
}

public class B : IB
{
    public B(IC c) { /* ... */ }
}

public class C1 : IC
{
    public C1() { /* ... */ }
}

public class C2 : IC
{
    public C2() { /* ... */ }
}

public interface IA { }
public interface IB { }
public interface IC { }

我可以将Ninject配置为执行此类操作吗?

var a = new A(new IB[]
{
    new B(new C1()),
    new B(new C2())
});

我不想创建一个采用多种IC类型的IB实现,因为IB在逻辑上与单个IC类型相关联。处理更高级别的IB实例要容易得多。

我希望这样做会有效:

var kernel = new StandardKernel();
kernel.Bind<IC>().To<C1>();
kernel.Bind<IC>().To<C2>();
kernel.Bind<IB>().To<B>();
kernel.Bind<IA>().To<A>();

var a = kernel.Get<IA>();

但它引发了一个例外:

Error activating IC
More than one matching bindings are available.
Matching bindings:
  1) binding from IC to C1
  2) binding from IC to C2
Activation path:
  3) Injection of dependency IC into parameter c of constructor of type B
  2) Injection of dependency IB into parameter bs of constructor of type A
  1) Request for IA

1 个答案:

答案 0 :(得分:0)

可能是为IB + IC的所有组合创建多个绑定:

var kernel = new StandardKernel();
kernel.Bind<IB>().To<B>()
    .WithParameter(
        new TypeMatchingConstructorArgument(
            typeof(IC), 
            (ctx, target) => ctx.Kernel.Get<C1>()));
kernel.Bind<IB>().To<B>()
    .WithParameter(
        new TypeMatchingConstructorArgument(
            typeof(IC),
            (ctx, target) => ctx.Kernel.Get<C2>()));
kernel.Bind<IA>().To<A>();

var a = kernel.Get<IA>();