使用 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
对象有两个参数 - 第一个是要覆盖的参数的名称,第二个是它的注入(inject)值。
是否可以根据其在构造函数足迹中的位置而不是形式参数名称将 mySettings
注入(inject)到 IService
的构造函数中?
编辑
根据@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;
}
}
最佳答案
不,您必须通过将绑定(bind)用作 ToProvider
、抽象工厂或使用位置参数的重载的每个组合的上下文绑定(bind)来解决这个问题,例如:
Bind<IService>().To<MyService>().WithConstructorArgument(...).Named(...)
Bind<IService>().To<MyService>().WithConstructorArgument(...).WhenInjectedInto(...)
关于c# - 将位置参数传递给 Ninject 中的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385734/