Вопрос, который вы должны задать себе: как контейнер может знать, когда использовать какую реализацию? Без дополнительной информации контейнер не может этого знать.
А также, с несколькими реализациями ISomeService
, вы должны требовать, чтобы клиенты всегда работали с несколькими экземплярами?
Обычно я думаю, что сервисы типа IUserRepository
имеют только одну реализацию за один раз. Конечно, вы можете удалить одну реализацию и использовать другую, но клиентским классам потребуется только один экземпляр, а не несколько.
Если на самом деле ваш контейнер будет содержать несколько реализаций одного и того же интерфейса, для клиентских классов должно иметь смысл принимать несколько экземпляров или, по крайней мере, иметь некоторые метаданные, чтобы знать, какую реализацию использовать.
Чтобы клиенты могли принимать несколько экземпляров с помощью Autofac, достаточно просто получить зависимость от IEnumerable<ISomeService>
, и контейнер передаст все экземпляры. Если клиентские классы должны принять разумное решение о том, какой экземпляр использовать, вы должны дополнить регистрации метаданными. Вопрос, к которому вы относитесь, использует какие-то метаданные в форме самих классов. Возможно, лучше использовать метаданные, более не связанные между собой. Обсуждение того, как это реализовано в Autofac, можно найти здесь .