使用 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
对象采用两个参数 - 第一个是要重写的参数的名称,第二个是其注入的值。
是否可以根据IService
构造函数在构造函数足迹中的位置而不是形式参数名称将mySettings
注入到构造函数?
编辑
根据@nemesv的要求,我正在为ConcreteService
添加一些示例代码。我的动机是基于一个概念,即取决于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;
}
}
不,您必须通过使用绑定作为ToProvider
、抽象工厂或使用位置参数为每个重载组合使用上下文绑定来解决此问题,例如:
Bind<IService>().To<MyService>().WithConstructorArgument(...).Named(...)
Bind<IService>().To<MyService>().WithConstructorArgument(...).WhenInjectedInto(...)