调用ninject2.Get <concreteclass>()</concreteclass>时出现“多个绑定”错误

时间:2010-08-22 21:47:53

标签: c# dependency-injection ninject

我想做这样的事情:

ConcreteClass foo = ninject2.Get<ConcreteClass>(
    new ConstructorArgument("bar", "qux"));

ninject2.Bind<ConcreteClass>().ToConstant(foo);

...

ConcreteClass foo = ninject2.Get<ConcreteClass>(); // fail!

当我尝试时,我收到错误Error activating ConcreteClass. More than one matching bindings are available.

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

OOTB,Ninject(特别是v2 - 在v1中,它是一个默认为on的可选设置)在内部为自己生成具体类的隐式绑定,使用默认的作用域(在v2中为Transient)。这些注册被添加到Bindings列表中,就好像您是通过自己添加它们一样。

Bind<ConcreteClass>().ToSelf(); // .InTransientScope(); -- But that would be implicit

如果您的绑定需要不同的内容,请在自动绑定之前注册Bind您的自定义位 a la:

Bind<ConcreteClass>().ToSelf().<<Your Customisation Bit>>;

在这种情况下,您的补救措施是使用以下内容:

Bind<ConcreteClass>().ToSelf().InSingletonScope().WithConstructorArgument( "foo", "bar");

InSingletonScope()与您当前的代码匹配,看起来您只想实例化一个。一般来说,正如其他答案所述,人们不一定要抓住InSingletonScope作为首选工具。