我正在绑定从Ninject中相同接口继承的类的实例:
IOC.Kernel.Bind<IService>.ToConstant(new ServiceA());
IOC.Kernel.Bind<IService>.ToConstant(new ServiceB());
IOC.Kernel.Bind<IService>.ToConstant(new ServiceC());
public interface IService
{
[...]
}
public class ServiceA : IService { [..] }
public class ServiceB : IService { [..] }
public class ServiceC : IService { [..] }
检索实例的通用方法是IOC.Get<IService>();
,但由于我绑定了三个不同的类,所以它不起作用。
我想基于我的应用程序中的枚举获取有效的实例类型:
public IService GetCurrent()
{
switch (CurrentServiceEnum)
{
case ServiceType.ServiceA:
return IOC.Get<IService>()// ?? Get type ServiceA
case ServiceType.ServiceB:
return IOC.Get<IService>()// ?? Get type ServiceB
case ServiceType.ServiceC:
return IOC.Get<IService>()// ?? Get type ServiceC
}
return null;
}
我的问题是我不知道如何获取指定类型的IService
的实例,例如。 ServiceB
。
Ninject文档说我实际上可以为每个绑定命名并检索一个有效的类型,例如:IOC.Get<IService>("ServiceB")
但是在这种特殊情况下,我不喜欢按字符串命名的想法,而是选择使用泛型(仅举一个例子):IOC.Get<IService>.OfType<ServiceB>()
。
Ninject是否可以使用某些方法来做到这一点? 我应该使用哪种方法来实现?
答案 0 :(得分:1)
就像Ninject所说,命名是正确的方法。为了避免使用string
作为名称,可以使用nameof()
运算符,如下所示:
IOC.Get<IService>(nameof(ServiceA));
IOC.Get<IService>(nameof(ServiceB));
IOC.Get<IService>(nameof(ServiceC));
这将允许您使用强类型名称,在您的情况下,该名称恰好是服务class
本身
答案 1 :(得分:1)
如果您已经知道要注入的类型,则可以这样做:
Bind<IService, ServiceA>().ToConstant(new ServiceA());
Bind<IService, ServiceB>().ToConstant(new ServiceB());
并通过
进行检索IResolutionRoot.Get<ServiceB>();