将多个接口绑定到同一实现

时间:2019-05-16 18:26:43

标签: c# ninject

我对此问题有一个后续问题:Is it possible to bind different interfaces to the same instance of a class implementing all of them?

我有一种情况,其中一个接口需要使用“命名”扩展名提供的名称来解析,而另一个不需要名称来解析。

例如

public interface IMachine { }
public interface IDrillMachine : IMachine { }

public class Drill: IDrillMachine { }
public class ScrewDriver: IMachine { }

插入绑定

Bind<IMachine, IDrillMachine>().To<Drill>().Named("Drill");
Bind<IMachine>.To<ScrewDriver>().Named("ScrewDriver");

注射

public class MachineConsumer
{
    public MachineConsumer([Named("Drill")]IMachine drillMachine)
    { }
}

public class DrillConsumer
{
    public DrillConsumer(IDrillMachine drillMachine)
    { }
}

我的代码无法正常工作,因此无法测试。但是我认为在解决IDrillMachine时会感到困惑,不是吗?

1 个答案:

答案 0 :(得分:0)

那是行不通的,因为DrillConsumer构造函数缺少[Named("Drill")]名称规范,但是IDrillMachine的绑定需要它。 可以通过Drill的两个单独的绑定来解决您的情况:

Bind<IMachine>().To<Drill>().Named("Drill");
Bind<IDrillMachine>().To<Drill>();

如果Drill需要像单例这样的作用域对象,则情况会有些复杂。将InSingletonScope()添加到两个绑定中将导致两个实例,一个实例用于IMachine(“钻”),一个实例用于IDrillMachine

要解决此问题,您可以添加一个间接级别:

Bind<IMachine>().ToMethod(ctx => ctx.Kernel.Get<Drill>()).Named("Drill");
Bind<IDrillMachine>().ToMethod(ctx => ctx.Kernel.Get<Drill>());
Bind<Drill>().ToSelf().InSingletonScope();