Разрешить зависимость с помощью autofac на основе атрибута параметра конструктора

Предположим, у меня есть две службы (A и B), зарегистрированные как ISomeService. Также предположим, что в будущем мне понадобятся классы, которым понадобится один из этих сервисов. Но я еще не знаю названий классов. Все, что я знаю, это то, что они реализуют данный интерфейс или абстрактный класс (все классы, реализующие данный интерфейс, нуждаются в одном и том же экземпляре ISomeService). Как я могу убедиться, что это разрешение происходит?

Вот связанный вопрос, где имя класса, использующего разрешенный сервис, известно. Но в моем случае имя класса CustomerRepository заранее неизвестно. Известно только имя интерфейса (например, IUserRepository или IFunctionRepository) или абстрактного класса. Другими словами, я просто знаю, что SomeRepository: IUserRepository и что типы IUserRepository нуждаются в A. Я должен разрешить пользователю писать больше классов, реализующих IUserRepository.

Вот как лучше поставить вопрос. Мне нужно, чтобы все конструкторы IFunctionRepository получили A (где A: ISomeService) и все конструкторы IUserRepository получили B (где B: ISomeService)


person ada    schedule 25.07.2011    source источник


Ответы (1)


Вопрос, который вы должны себе задать: как контейнер узнает, когда какую реализацию использовать? Без дополнительной информации контейнер не может этого знать.

Кроме того, при наличии нескольких реализаций ISomeService следует ли требовать, чтобы клиенты всегда работали с несколькими экземплярами?

Обычно я думаю, что такие сервисы, как IUserRepository, имеют только одну реализацию в любой момент времени. Конечно, вы можете вырвать одну реализацию и использовать другую, но для клиентских классов потребуется только один экземпляр, а не несколько.

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

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

person Peter Lillevold    schedule 25.07.2011
comment
Спасибо за редкий ответ - person ada; 26.07.2011
comment
@ada - Спасибо! Редкий? :) надеюсь, вы найдете это полезным. Если это так, отметьте мой ответ как принятый. - person Peter Lillevold; 26.07.2011
comment
Я имел в виду, что очень мало людей заботятся хотя бы о том, чтобы просмотреть вопрос. :) - person ada; 26.07.2011
comment
Я понимаю вашу точку зрения :) Я стараюсь отвечать на все вопросы, связанные с Autofac, это такая замечательная библиотека :) - person Peter Lillevold; 26.07.2011