2012-10-03 53 views
0

我正在使用NInject。我有这样的对象Ninject构造函数绑定

interface IFoo {} 

class Foo : IFoo { 
    public Foo(string magic, IBar bar) {} 
} 

我想通过只传递魔法注入一些foo。每个类的魔法是不同的,所以这应该返回不同的实例。

s_Kernel.Get<IFoo>("magic"); 
s_Kernel.Get<IFoo>("not-so-magic"); 

第一次我试图绑在我做

s_Kernel.Bind<IFoo>().To<Foo>(); 

但后来我有东西来看看它看起来有点蹩脚。

s_Kernel.Get<IFoo>(new ConstructorArgument("magic", magic), s_Kernel.Get<IBar>()); 

我不想明确地把自己绑在魔法字符串上。

我得到的印象是Bind<IFoo>().ToConstructor(ctorArg => new Foo(xxx, ctorArg.Kernel.Get<IFoo>());几乎可以让我那里,但我不知道我应该为“xxx”放置什么,以便它查找参数。

回答

1

您要么寻找Ninject.Extensions.Factory(或WithConstructorArgument一块在Bind流利表达链的最后,但我相当确信你不是这个意思)。

+0

谢谢,这看起来是我想要的,但在引擎盖下它仍然要求我保持引擎盖下的参数名称。这对我来说很可怕,因为它引入了一组奇怪的错误。我会考虑重构我的代码,不要求这样做。 –

+0

是的,你也需要验收测试级别的某些性质的覆盖,但这需要很多东西。 (你可能会发疯,写一些Rube Goldberg的东西,它通过接口定位所有的ToFactory()调用和蜘蛛,并检查构造函数是否存在等。但是如果你甚至在考虑这一点,请阅读@ploeh测试DI配置。) –

+0

我建议看看源代码和测试,看看是否有可用于创建la [NamedLikeFactoryMethod](https://github.com/ninject/)的可扩展性钩子ninject.extensions.factory/wiki/Factory-interface%3A-Referencing-Named-Bindings),它可能使用'Bind'流畅序列的'.ToConstructor'部分的一些机制来做一些验证? (最后一句话不应该是有道理的,但可能让你思考) –