2012-02-24 21 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");