如何在ninject 2.0中使用此功能?With.Parameters.ConstructorArgument with ninject 2.0
MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
「同向」是不是有:(
如何在ninject 2.0中使用此功能?With.Parameters.ConstructorArgument with ninject 2.0
MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
「同向」是不是有:(
[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);
}
我不知道,如果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");
這並不完美,但應該在大多數情況下完成這項工作。
感謝您的回答,但不幸的是,我不能調用我的對象的構造函數沒有這個參數... Ninject 1.x做的工作很好,我想知道這個功能如何改變2.0版本。 – andrecarlucci 2009-09-03 16:33:11
可以使用ResolveAtGet將參數傳遞給對象圖中的對象嗎? – Zach 2012-05-29 08:48:52
Get方法調用僅將參數傳遞給正在解析的頂級項目。除此之外,如果您希望將參數傳遞給鏈中較深的對象,則必須在綁定中執行此操作。 – 2012-05-29 11:01:20
@Zach(和伊恩,但他知道這一點!)底層WithConstructorArgument/ConstuctorArgumetn ctor上有一個超載,它允許參數被標記爲繼承,導致它們傳播到像我認爲你想要的子分辨率。 (一般來說,這是錯誤的方法,會造成混亂,但它肯定在那裏) – 2012-05-29 12:00:13