nor*_*gie 5 ninject activator constructor-injection
我对Ninject很新,但我已成功使用自定义提供程序将其用于DI.
绑定初始化如下
kernel = new StandardKernel();
kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>();
Run Code Online (Sandbox Code Playgroud)
在自定义提供程序中,我像这样调用Activator.CreateInstance
protected override IPatientRecordLocator CreateInstance(IContext context)
{
var name = ConfigurationManager.AppSettings["PatientRecordLocator"];
var typeName = name.Split(',')[0];
var assemblyName = name.Split(',')[1];
return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator;
}
Run Code Online (Sandbox Code Playgroud)
(是的,我知道上面的代码中没有错误处理等:))
而这一切都像一个魅力.
现在,我面临的问题是当我引入一个我希望注入IPatientRecordLocator实例的新类时.当我向其中一个类添加如下构造函数时,会出现问题
[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后,为了使Activator.CreateInstance工作,我还必须向类MockPatientRecordLocator添加一个无参数构造函数,即
public MockPatientRecordLocator()
{
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:如何让Ninject注入一个实现IContactAdapter的类的实例到例如MockPatientRecordLocator?我尝试过注射方法,但无济于事.
我忘了解释我正在尝试实现的是一种链式注入,其中一个类PatientRecordSummary的实例被注入一个MockPatientRecordLocator实例(使用构造函数注入),并且所述MockPatientRecordLocator实例应该注入一个IContactAdapter实例(再次使用构造函数注入(如果可能)).链的第一部分工作,第二部分没有.
对于第一个问题来说还不错!
您希望使用Bind(Type)重载来允许注册在代码上下文中没有静态可用的内容-预先Load()在提供程序中执行您正在执行的操作(即解析 ) 。Type这将允许 Ninject 进行对象实例化(无需默认 .ctor)
IIRC我最近的两个或三个答案也涉及到这个发现/加载的东西,并且有应该与您的案例相关的示例。
[Inject](当你要删除东西时,你不需要诉诸属性)
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |