Разрешить зависимость с помощью autofac на основе атрибута параметра конструктора - PullRequest
1 голос
/ 25 июля 2011

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

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

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

1 Ответ

2 голосов
/ 26 июля 2011

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

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

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

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

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

...