我对此问题有一个后续问题: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
时会感到困惑,不是吗?
答案 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();