使用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
在构造函数占用空间中的位置而不是形式参数名称来注入IService
到ConcreteService
的构造函数?
修改
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}}
答案 0 :(得分:1)
不,你必须通过使用绑定作为ToProvider
,抽象工厂或使用位置参数的每个重载组合的上下文绑定来解决这个问题,例如:
Bind<IService>().To<MyService>().WithConstructorArgument(...).Named(...)
Bind<IService>().To<MyService>().WithConstructorArgument(...).WhenInjectedInto(...)