2013-07-26 4 views
9

Есть ли способ зарегистрировать один интерфейс, который реализуется более чем одним конкретным классом с использованием [простой инжектор] и без использования интерфейса шаблона?Зарегистрировать несколько реализаций с помощью одного интерфейса

у нас есть 2 классов MyClass1 и Myclass2 и обе эти классы реализуют IInterface1

Теперь, используя [простой инжектор] мы были не в состоянии сделать это

container.Register<IInterface1, Myclass1>(); 
container.Register<IInterface1, Myclass2>(); 

преобразования существующего интерфейса в интерфейс шаблона это тяжелая работа над существующей кодовой базой. Надеюсь, что там немного легче.

ответ

12

Вы можете зарегистрировать несколько реализации одного и того же интерфейса с помощью метода RegisterCollection (см documentation: Настройка коллекции экземпляров должны быть возвращены)

Таким образом, вы должны написать:

container.RegisterCollection<IInterface1>(new[] { typeof(Myclass1), typeof(Myclass2) }); 

И теперь Простой инжектор может вводить коллекцию из Interface1 в ваш конструктор, например:

public class Foo 
{ 
    public Foo(IEnumerable<IInterface1> interfaces) 
    { 
     //... 
    } 
} 

Или вы можете явно разрешить свои IInterface1 реализаций с GetAllInstances:

var myClasses = container.GetAllInstances<IInterface1>(); 
+0

Проблема с SimpleInjector не после регистрации нескольких реализаций для одного интерфейса, нет никакого способа, чтобы определить, какие из зарегистрированных случаев должны быть возвращены для данного интерфейса. В вашем примере вы не можете указать, чтобы возвращать экземпляр класса Myclass2 при запросе IInterface1. Другие контейнеры IoC, такие как Ninject, позволяют «указывать» каждую учетную запись для одного и того же сервиса (интерфейса), поэтому вы можете повторно устранить проблему во время разрешения. – Lester

+2

@ Lester: Если вам это нужно, убедитесь, что вы не нарушаете [Принцип замены Лискова] (https://en.wikipedia.org/wiki/Liskov_substitution_principle), если вам это нужно. Но в любом случае, вот более подробная информация об использовании [keyed registration in Simple Injector] (https://simpleinjector.readthedocs.org/en/latest/howto.html#resolve-instances-by-key). – Steven

+1

@nemesv Что делать, если нам нужна одна реализация за раз, например. Конструктор класса Shoper имеет интерфейс ICreditCard. И 2 класса MasterCard и VisaCard реализуют ICreditCard. Покупателю нужен один класс за раз. Как использовать IOC i этот сценарий? –

Смежные вопросы