我对Ninject很新,但我已经成功地使用自定义提供程序将其用于DI。
绑定初始化如下
kernel = new StandardKernel();
kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>();
在自定义提供程序中,我调用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;
}
(是的,我知道上面的代码中没有错误处理等):))
所有这一切都像魅力。
现在,我面临的问题是当我引入一个我希望注入IPatientRecordLocator实例的新类时。当我添加如下所示的构造函数时,会出现问题。其中一个类
[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
...
}
然后,要使Activator.CreateInstance工作,我还必须在类MockPatientRecordLocator中添加一个无参数构造函数,即
public MockPatientRecordLocator()
{
}
所以,我的问题是:如何让Ninject注入一个实现IContactAdapter的类的实例。 MockPatientRecordLocator?我尝试过注射方法,但无济于事。
我忘了解释我正在尝试实现的是一种链式注入,其中一个类PatientRecordSummary的实例被注入一个MockPatientRecordLocator实例(使用构造函数注入),并且所述MockPatientRecordLocator实例应该注入一个实例IContactAdapter(再次使用构造函数注入(如果可能))。链的第一部分工作,第二部分不工作。
答案 0 :(得分:1)
第一个问题还不错!
您希望使用Bind(Type)
重载来允许在Load()
代码的上下文中注册您没有静态可用的内容 - 执行您在提供程序中执行的操作(即,预先解决Type
)。这将允许Ninject进行对象实例化(不需要默认的.ctor)
IIRC two or 3 of my most recent answers也会触及此发现/加载内容,并提供与您的案例相关的示例。
(当你要删除东西时,你不需要诉诸[Inject]
属性)