Зарегистрировать несколько реализаций с помощью единого интерфейса

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

говорят, что у нас есть 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));