【问题标题】:Ninject, Providers and Activator.CreateInstanceNinject、Providers 和 Activator.CreateInstance
【发布时间】:2010-09-18 13:24:31
【问题描述】:

我对 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 的类的实例注入到例如模拟病人记录定位器?我尝试过方法注入,但无济于事。

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

【问题讨论】:

    标签: ninject activator constructor-injection


    【解决方案1】:

    第一个问题还不错!

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

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

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

    【讨论】:

    • 嗨鲁本,感谢您的帮助(和赞美)。尽我所能:-) 在这个特定的设置中我没有使用模块,但我会切换到使用它们以便我可以更轻松地使用 Bind()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多