我想做这样的事情:
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.
这里发生了什么?
答案 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
作为首选工具。