在 Ninject 中获取特定类型的实例
Getting instance of certain type in Ninject
我正在绑定从 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 是否允许我使用某种方法来做到这一点?
我应该使用哪种方法来实现?
如Ninject所说,命名是正确的方法。为避免使用 string
作为名称,您可以使用 nameof()
运算符,如下所示:
IOC.Get<IService>(nameof(ServiceA));
IOC.Get<IService>(nameof(ServiceB));
IOC.Get<IService>(nameof(ServiceC));
这将允许您使用强类型名称,在您的情况下恰好是服务 class
本身
如果您已经知道要注入的类型,您也可以这样做:
Bind<IService, ServiceA>().ToConstant(new ServiceA());
Bind<IService, ServiceB>().ToConstant(new ServiceB());
并通过
检索
IResolutionRoot.Get<ServiceB>();
我正在绑定从 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 是否允许我使用某种方法来做到这一点? 我应该使用哪种方法来实现?
如Ninject所说,命名是正确的方法。为避免使用 string
作为名称,您可以使用 nameof()
运算符,如下所示:
IOC.Get<IService>(nameof(ServiceA));
IOC.Get<IService>(nameof(ServiceB));
IOC.Get<IService>(nameof(ServiceC));
这将允许您使用强类型名称,在您的情况下恰好是服务 class
本身
如果您已经知道要注入的类型,您也可以这样做:
Bind<IService, ServiceA>().ToConstant(new ServiceA());
Bind<IService, ServiceB>().ToConstant(new ServiceB());
并通过
检索IResolutionRoot.Get<ServiceB>();