将接口的两个单独实例绑定到对象构造函数中

时间:2013-08-06 12:55:45

标签: ninject

我有以下界面和对象

public interface IFoo{}
public interface IBar{}

public class Foo : IFoo {
    public Foo(IBar bar1, IBar bar2)
    {
    }
}

public class Bar1 : IBar {}
public class Bar2 : IBar {}

我有以下Ninject绑定

Bind<IBar>()
    .To<Bar1>()
    .InSingletonScope()
    .Named("bar1");
Bind<IBar>()
    .To<Bar2>()
    .InSingletonScope()
    .Named("bar2);
Bind<IFoo>()
    .To<Foo>()
    .InSingletonScope()
    .WithConstructorArgument("bar1", context => Kernel.Get<IBar>("bar1"))
    .WithConstructorArgument("bar2", context => Kernel.Get<IBar>("bar2"));

现在这个工作,但是我真的不喜欢必须手动指定'Foo'类的构造函数值。理想情况下,我想要一些让我这么说的东西:

所有具有属性名称'bar1'的构造函数属性应使用同名的命名实例,如果命名实例不存在,则使用默认实例'Bar2'

或类似的东西。

真的,有没有更好的方法来实现我想要实现的目标?

1 个答案:

答案 0 :(得分:1)

只需将构造函数更改为

,而不是命名实例
public class Foo : IFoo 
{
    public Foo(IBar[] bars)
    {
    }
}

然后Ninject将注入每种IBar注册的实例。