将位置参数传递给Ninject中的构造函数

时间:2014-01-27 16:10:37

标签: c# ninject

使用Ninject 3.0,我知道我可以在解决时间将参数传递给具体服务的构造函数:

IKernel kernel = new StandardKernel();
kernel.Bind<IService>.To<ConcreteService>();
MySettings mySettings = new DefaultConcreteServiceSettings();

IService service = kernel.Get<IService>(new[] { new ConstructorArgument("settings", mySettings) });

ConstructorArgument对象有两个参数 - 第一个是要覆盖的参数的名称,第二个是它的注入值。

是否可以根据mySettings在构造函数占用空间中的位置而不是形式参数名称来注入IServiceConcreteService的构造函数?

修改

Per @ nemesv的请求,我正在为IService添加一些示例代码。我的动机是基于一个概念,即根据public class ConcreteService : IService { readonly ISettings _settings; public ConcreteService(ISettings settings) { _settings = settings; } } public class ConcreteServiceBySomePoorGuyWhoCantSpell : IService { readonly ISettings _settings; public ConcreteServiceBySomePoorGuyWhoCantSpell(ISettings suttingz) { _settings = suttingz; } } 的每个具体实现的参数名称,使代码变得脆弱:

{{1}}

1 个答案:

答案 0 :(得分:1)

不,你必须通过使用绑定作为ToProvider,抽象工厂或使用位置参数的每个重载组合的上下文绑定来解决这个问题,例如:

Bind<IService>().To<MyService>().WithConstructorArgument(...).Named(...)
Bind<IService>().To<MyService>().WithConstructorArgument(...).WhenInjectedInto(...)