在Ninject

时间:2018-06-28 08:12:23

标签: c# binding inversion-of-control 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是否可以使用某些方法来做到这一点? 我应该使用哪种方法来实现?

2 个答案:

答案 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>();