gpt4 book ai didi

Ninject、Providers 和 Activator.CreateInstance

转载 作者:行者123 更新时间:2023-12-04 21:51:25 25 4
gpt4 key购买 nike

我对 Ninject 还很陌生,但我已经成功地使用自定义提供程序将它用于 DI。

绑定(bind)初始化如下

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;
}

(是的,我知道上面的代码中没有错误处理等:))

这一切就像一个魅力。

现在,我面临的问题是当我引入一个希望注入(inject) IPatientRecordLocator 实例的新类时。当我将如下构造函数添加到例如这些类(class)之一
[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
...
}

然后,为了使 Activator.CreateInstance 工作,我还必须向类 MockPatientRecordLocator 添加一个无参数构造函数,即
public MockPatientRecordLocator() 
{
}

所以,我的问题是:如何让 Ninject 将实现 IContactAdapter 的类的实例注入(inject)到例如模拟病人记录定位器?我尝试过方法注入(inject),但无济于事。

我忘了解释我想要实现的是一种链式注入(inject),其中 PatientRecordSummary 类的实例被注入(inject) MockPatientRecordLocator 的实例(使用构造函数注入(inject)),并且所述 MockPatientRecordLocator 的实例应该被注入(inject) IContactAdapter 的实例(再次使用构造函数注入(inject)(如果可能))。链条的第一部分有效,第二部分无效。

最佳答案

第一个问题还不错!

您想使用 Bind(Type)允许注册在 Load() 的上下文中没有静态可用的东西的重载代码 - 预先在提供程序中执行您正在执行的操作(即解析 Type )。这将允许 Ninject 进行对象实例化(无需任何默认 .ctor)

IIRC two or 3 of my most recent answers还涉及此发现/加载内容,并提供与您的案例相关的示例。

(当你要删除东西时,你不需要诉诸 [Inject] 属性)

关于Ninject、Providers 和 Activator.CreateInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3741849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com