2012-02-24 44 views
2

我使用Ninject模块将不同类型绑定到它们相应的接口。在Ninject上使用Func创建构造函数

注入将采取一个类的构造函数里面的地方。问题是这个类有另一个带有包含Func的签名的构造函数。

Ninject是迷茫,抛出这个我:

错误使用隐式的自我约束力ClassTest的激活ClassTest。几个构造函数具有相同的优先级。请使用ToConstructor语法指定构造函数或添加Inject属性。

请参见下面的结合是怎么做的,我该怎么办注射:

this.Bind<InterfaceA>().To<ClassA>(); 
... 

public class ClassTest 
{ 
    public ClassTest(InterfaceA a) 
    { 
    } 

    public ClassTest(Func<ClassB> funcB) 
    { 
    } 
} 

... 
var giveMeTest = kernel.Get<ClassTest>(); // exception thrown 
} 

看来,Func键是罪魁祸首在这里,你能解释一下我为什么Ninject就会犯糊涂?

感谢

回答

8

最好的,你删除所有未使用的构造函数。没有理由添加从不使用的构造函数。如果你真的需要多个构造函数,那么你必须告诉Ninject哪一个选择,例如:

Bind<ClassTest>().ToConstructor(x => new ClassTest(x.Inject<InterfaceA>())).Named("A"); 
Bind<ClassTest>().ToConstructor(x => new ClassTest(x.Inject<Func<ClassB>>())).Named("B"); 

kernel.Get<ClassTest>("A"); 
kernel.Get<ClassTest>("B");