Есть ли способ зарегистрировать один интерфейс, который реализуется более чем одним конкретным классом с использованием [простой инжектор] и без использования интерфейса шаблона?Зарегистрировать несколько реализаций с помощью одного интерфейса
у нас есть 2 классов MyClass1
и Myclass2
и обе эти классы реализуют IInterface1
Теперь, используя [простой инжектор] мы были не в состоянии сделать это
container.Register<IInterface1, Myclass1>();
container.Register<IInterface1, Myclass2>();
преобразования существующего интерфейса в интерфейс шаблона это тяжелая работа над существующей кодовой базой. Надеюсь, что там немного легче.
Проблема с SimpleInjector не после регистрации нескольких реализаций для одного интерфейса, нет никакого способа, чтобы определить, какие из зарегистрированных случаев должны быть возвращены для данного интерфейса. В вашем примере вы не можете указать, чтобы возвращать экземпляр класса Myclass2 при запросе IInterface1. Другие контейнеры IoC, такие как Ninject, позволяют «указывать» каждую учетную запись для одного и того же сервиса (интерфейса), поэтому вы можете повторно устранить проблему во время разрешения. – Lester
@ 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
@nemesv Что делать, если нам нужна одна реализация за раз, например. Конструктор класса Shoper имеет интерфейс ICreditCard. И 2 класса MasterCard и VisaCard реализуют ICreditCard. Покупателю нужен один класс за раз. Как использовать IOC i этот сценарий? –