2009-09-03 7 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

+0

Getメソッド呼び出しは、解決されている最上位レベルの項目にのみパラメータを渡します。それ以外にも、チェーン内のオブジェクトにパラメータを渡したい場合は、バインディングでそれを行う必要があります。 –

+0

@Zach(でもIanだが、彼はこれを知っている!)基底のWithConstructorArgument/ConstuctorArgumetn ctorにオーバーロードがあり、argsが継承されているとマークされ、子のResolutionsに伝播させる。 (一般的に間違ったアプローチで混乱を招くが、間違いなくそこにある) –

1

「と」Ninject(私はNinjectが(私は現在、離れて私の開発コンピュータからだ)、それをサポートしているかどうかわからないんだけど、他のすべてが失敗した場合ドキュメントはあなたの問題を解決するために、コンストラクタから初期化を分離できる)希望する多くの葉:

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

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

その後、あなたはこれを行うことができます3210

これは完璧とはほど遠いですが、ほとんどの場合、その仕事をする必要があります。この機能はでどのように変化したか

+0

答えてくれてありがとう、残念ながら私は、このパラメータを指定せずに私のオブジェクトのコンストラクタを呼び出すことはできません... Ninject 1.xのは、かなりよく仕事をして私が知りたいのですが2.0バージョン。 – andrecarlucci