gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:37:13 25 4
gpt4 key购买 nike

我有以下类(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/

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