Зарегистрировать несколько реализаций с помощью единого интерфейса
Есть ли способ зарегистрировать один интерфейс, который реализуется более чем одним конкретным классом с использованием [простой инжектор] и без использования интерфейса шаблона?
говорят, что у нас есть 2 класса MyClass1
и Myclass2
, и оба этих класса реализуют IInterface1
Теперь, используя [simple-injector], мы не смогли этого сделать
container.Register<IInterface1, Myclass1>();
container.Register<IInterface1, Myclass2>();
преобразование существующего интерфейса в интерфейс шаблона - это тяжелая работа над существующей кодовой базой. Надеясь, там есть что-то более легкое.
Ответы
Ответ 1
Вы можете зарегистрировать несколько реализаций одного и того же интерфейса с помощью метода RegisterCollection
(см. документацию: настройка коллекции возвращаемых экземпляров)
Так что вам нужно написать:
container.Collection.Register<IInterface1>(typeof(Myclass1), typeof(Myclass2));
И теперь Simple Injector может внедрить коллекцию реализации Interface1
в ваш конструктор, например:
public class Foo
{
public Foo(IEnumerable<IInterface1> interfaces)
{
//...
}
}
Или вы можете явно разрешить свои реализации IInterface1
с помощью GetAllInstances
:
var myClasses = container.GetAllInstances<IInterface1>();
Ответ 2
Я столкнулся с той же проблемой. Я нашел обходной путь, вы можете выбрать реализацию в зависимости от потребителя (хотелось бы, чтобы все было наоборот!). Смотрите пример ниже:
container.RegisterConditional<IInterface1, Myclass1>(
c => c.Consumer.ImplementationType == typeof(Myclass2Service));
container.RegisterConditional<IInterface1, Myclass2>(
c => c.Consumer.ImplementationType == typeof(Myclass2Service));