Ninject Проблема получения экземпляров - PullRequest
2 голосов
/ 05 июля 2011

я получил крошечный интерфейс ITest:

public interface ITest
{
    void DoSomething();
}

и некоторые реализации ITest

public class Test : ITest
{
    public void DoSomething()
    {
        throw new NotImplementedException();
    }
}

public class Test2 : ITest
{
    public void DoSomething()
    {
        throw new NotImplementedException();
    }
}

public class Test3 : ITest
{
    public void DoSomething()
    {
        throw new NotImplementedException();
    }
}

public class Test4 : ITest
{
    public void DoSomething()
    {
        throw new NotImplementedException();
    }
}

Теперь я настраиваю Ninject:

kernel.Bind<ITest>().To<Test>().Named("Test");
kernel.Bind<ITest>().To<Test2>().Named("Test");
kernel.Bind<ITest>().To<Test3>().Named("Test");
kernel.Bind<ITest>().To<Test4>().Named("Test");

А вот и моя первая проблема.

Если я пытаюсь получить экземпляр, используя

ITest test = kernel.Get<ITest>("Test");

это приводит к исключению "Ошибка при активации ITest. Доступно более одной соответствующей привязки. ...". Документация гласит: «Получает экземпляр указанной службы, используя первую привязку с указанным именем.»

Вторая проблема:

List<ITest> servicesList = new List<ITest>(kernel.GetAll<ITest>("Test"));

приводит к исключению «Ошибка при активации строки. Соответствующие привязки недоступны, а тип не является самосвязываемым. ...». Документация гласит: «Получает все экземпляры указанного сервиса, используя привязки, зарегистрированные с указанным именем.»

Есть идеи? Заранее спасибо!

1 Ответ

4 голосов
/ 05 июля 2011

Вы даете всем своим экземплярам одно и то же имя Test, поэтому это нормально, что это будет неоднозначно.При регистрации ядра присваивайте им разные имена:

kernel.Bind<ITest>().To<Test>().Named("Test1");
kernel.Bind<ITest>().To<Test2>().Named("Test2");
kernel.Bind<ITest>().To<Test3>().Named("Test3");
kernel.Bind<ITest>().To<Test4>().Named("Test4");

Теперь вы можете выбрать экземпляры по имени:

ITest test = kernel.Get<ITest>("Test3");

И чтобы получить их все, имя больше не нужно:

List<ITest> servicesList = kernel.GetAll<ITest>().ToList();
...