Получение экземпляра определенного типа в Ninject - PullRequest
0 голосов
/ 28 июня 2018

Я связываю свои экземпляры классов, которые наследуются от того же интерфейса в 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 docs говорят, что я на самом деле могу назвать каждую привязку и получить действительный тип следующим образом: IOC.Get<IService>("ServiceB") однако мне не нравится идея именования по строке в данном конкретном случае, и я предпочел бы использовать универсальный тип (просто пример): IOC.Get<IService>.OfType<ServiceB>().

Позволит ли Ninject мне сделать это каким-нибудь методом? Какой метод я должен использовать для достижения этого?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Если вы уже знаете тип, который хотите ввести, вы также можете сделать:

Bind<IService, ServiceA>().ToConstant(new ServiceA());
Bind<IService, ServiceB>().ToConstant(new ServiceB());

И получить его по

IResolutionRoot.Get<ServiceB>();
0 голосов
/ 28 июня 2018

Как говорит Ninject, именование - это правильный путь. Чтобы не использовать string для имени, вы можете использовать оператор nameof(), например:

IOC.Get<IService>(nameof(ServiceA));
IOC.Get<IService>(nameof(ServiceB));
IOC.Get<IService>(nameof(ServiceC));

Это позволит вам использовать строго типизированное имя, которое в вашем случае является службой class самой

...