c# - Ninject 注入(inject)接口(interface)的多重绑定(bind)

标签 c# .net ninject

我有以下类(class):

using System;

interface IA { }

class A1 : IA { }

class A2 : IA { }

class B
{
    public B(IA a) {}
}

class BProvider : Provider<B>
{
    IA _a;

    public BProvider(IA a) { _a=a; }

    protected override B CreateInstance(IContext context) { return new B(_a); }
}

ninject 模块 Load() 代码:

Bind<IA>().To<A1>();
Bind<IA>().To<A2>();
Bind<B>().ToProvider<BProvider>();

主要代码:

kernel.GetAll<IA>(); // works fine
kernel.GetAll<B>(); // I expect to get IEnumerable<B> with two elements, but instead of this I get an error that there are multiple bindings of IA and ninject cannot determine which to use

所以问题是我是否可以使最后一条语句按预期工作或以其他方式进行?

最佳答案

它将抛出该异常,因为 Ninject 需要创建类型为 BProvider 的对象实例。为此,它必须填写对 IA 的依赖。但是瞬间... IA 上有两个绑定(bind),我应该选择哪个?....

您可以使用一些条件绑定(bind)来决定应该使用哪个实现。 一种方法是使用 NamedAttribute:

Bind<IA>().To<A1>();
Bind<IA>().To<A2>().Named("SecondImpl");
Bind<B>().ToProvider<BProvider>();


class BProvider : Provider<B>
{
    IA _a;

    public BProvider([Named("SecondImpl")]IA a) { _a=a; }

    protected override B CreateInstance(IContext context) { return new B(_a); }
}

在这种情况下,A1 将作为未指定 NamedAttribute 的默认值注入(inject)。

或者像@Remo Gloor 在这篇文章中解释的那样:Configuring Ninject

Bind<IA>().To<A1>();
Bind<IA>().To<A2>().WhenParentNamed("NeedSecondImpl");
Bind<B>().ToProvider<BProvider>().Named("NeedSecondImpl");

这更简洁一些,因为您不必将您的代码绑定(bind)到 Ninject,只需让它在配置上(在一个地方)。

关于c# - Ninject 注入(inject)接口(interface)的多重绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11676983/

相关文章:

c# - 无法通过 Wifi 从 Android 应用程序访问另一台机器中存在的图像文件夹

c# - 如何从 WMV 视频创建缩略图

c# - 为什么我不能覆盖 hibernate.cfg.xml 中的配置

asp.net - 未定义无参数构造函数对象

c# - 在带有 .NET MVC 的大型 CRUD View 中使用 IoC 和存储库模式

c# - 您可以停止通过其调用的方法执行的按钮单击事件吗?

c# - 保存调整大小按钮

c# - Request.IsAuthenticated 如何工作?

c# - 您如何在 .Net 项目中使用 'lib' 文件夹来构建依赖项?

c# - ninject 的循环依赖