C# 使用.Parameters.ConstructorArgument和ninject 2.0
如何在ninject 2.0中使用此功能C# 使用.Parameters.ConstructorArgument和ninject 2.0,c#,ninject,C#,Ninject,如何在ninject 2.0中使用此功能 MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar")); MyType obj=kernel.Get(带有.Parameters.ConstructorArgument(“foo”、“bar”); “With”不存在:(我不确定Ninject是否支持它(我目前不在开发计算机上),但如果所有其他操作都失败(Ninject文档还有很多需
MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
MyType obj=kernel.Get(带有.Parameters.ConstructorArgument(“foo”、“bar”);
“With”不存在:(我不确定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");
MyType obj=kernel.Get();
对象初始(“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 );
}
public void CtorArgTestResolveAtGet()
{
IKernel kernel=新的标准内核();
kernel.Bind().To();
var=内核
.Get(新的构造器参数(“武器”,新的剑());
Assert.IsType(战士.武器);
}
[事实]
public void CtorArgTestResolveAtBind()
{
IKernel kernel=新的标准内核();
kernel.Bind()到()
.使用构造器论证(“武器”,新剑());
var warrior=kernel.Get();
Assert.IsType(战士.武器);
}
谢谢您的回答,但不幸的是,如果没有此参数,我无法调用对象的构造函数…Ninject 1.x做得很好,我想知道此功能在2.0版本中是如何更改的。我可以使用ResolveAtGet将参数传递给对象图中的对象吗?Get方法调用仅将参数传递给正在解析的顶级项。除此之外,如果要将参数传递给链中更深的对象,则必须在绑定中执行该操作。@Zach(和Ian,但他知道这一点!)底层WithConstructorArgument/ConstructorArgumentn-ctor上有一个重载,它允许将参数标记为继承的,这会导致它们像我认为的那样传播到子分辨率中。(一般来说,这是错误的方法,会造成混乱,但肯定存在)