2009-09-03 33 views

回答

65
[Fact] 
    public void CtorArgTestResolveAtGet() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>(); 
     var warrior = kernel 
      .Get<IWarrior>(new ConstructorArgument("weapon", new Sword())); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 

    [Fact] 
    public void CtorArgTestResolveAtBind() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>() 
      .WithConstructorArgument("weapon", new Sword()); 
     var warrior = kernel.Get<IWarrior>(); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 
+1

可以使用ResolveAtGet將參數傳遞給對象圖中的對象嗎? – Zach 2012-05-29 08:48:52

+0

Get方法調用僅將參數傳遞給正在解析的頂級項目。除此之外,如果您希望將參數傳遞給鏈中較深的對象,則必須在綁定中執行此操作。 – 2012-05-29 11:01:20

+0

@Zach(和伊恩,但他知道這一點!)底層WithConstructorArgument/ConstuctorArgumetn ctor上有一個超載,它允許參數被標記爲繼承,導致它們傳播到像我認爲你想要的子分辨率。 (一般來說,這是錯誤的方法,會造成混亂,但它肯定在那裏) – 2012-05-29 12:00:13

1

我不知道,如果Ninject支持它(我目前從我的開發計算機的距離),但如果一切都失敗了(在Ninject文檔極不理想很多),你可以從構造函數初始化分開來解決問題:

class MyType 
{ 
    public class MyType() {} 
    public class MyType(string param1,string param2){Init(param1,param);} 
    public void Init(string param1,param2){...} 
} 

然後,你可以這樣做:

MyType obj = kernel.Get<MyType>(); 
obj.Init("foo","bar"); 

這並不完美,但應該在大多數情況下完成這項工作。

+0

感謝您的回答,但不幸的是,我不能調用我的對象的構造函數沒有這個參數... Ninject 1.x做的工作很好,我想知道這個功能如何改變2.0版本。 – andrecarlucci 2009-09-03 16:33:11