在 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>();