Ответ 1
Контейнер IoC обычно должен быть создан в проекте хоста (точка входа приложения). Для приложения Windows.Forms проект exe.
Обычно в простых решениях (в рамках 10 проектов) только хост-проект должен иметь ссылку на библиотеку IoC.
Скажем, у меня есть следующие 4 сборки .net:
Моя бизнес-логика (2) выполняет вызовы на уровень доступа к данным (3) через IRepository (определенный в 4), используя инъекцию зависимости конструктора. Однако, когда я завершаю бизнес-объект, мне нужно передать в реальный репозиторий. Я делаю это, если один класс singleton в моем бизнес-логическом слое возвращает используемый в настоящее время конкретный объект, реализующий IRepository. Я прихожу к выводу, что это плохо, поскольку мой уровень бизнес-логики теперь должен ссылаться на 3, а также на 4.
Я думаю, что мне нужен контейнер IoC, но вопрос в том, где я создаю/ставил его, как кажется, где бы я ни создавал этот (1 - UI)? также необходимо будет содержать ссылку на 3 (SQL Server Data Access). Разве я не просто перехожу к проблеме, а не к фактической развязке?
Создать контейнер IoC в пользовательском интерфейсе. Или выставить его через новую сборку.
(Я использую С#,.net 3.5 и AutoFac)
Спасибо.
Контейнер IoC обычно должен быть создан в проекте хоста (точка входа приложения). Для приложения Windows.Forms проект exe.
Обычно в простых решениях (в рамках 10 проектов) только хост-проект должен иметь ссылку на библиотеку IoC.
При регистрации компонентов существует несколько возможностей:
Регистрация в коде:
Регистрация с конфигурационным файлом:
Верхний уровень - это путь (UI, как сказал Ринат).
Теперь, что касается ссылок, самым простым способом является просто перебрать все сборки в текущей папке и использовать какое-то соглашение для получения услуг. Атрибуты работают нормально, при этом классы регистраторов в каждой сборке прекрасно работают, что вам подходит. Код для извлечения всего, вероятно, должен быть в отдельной сборке, если только ваша инфраструктура IoC уже делает это.
Различие модулей и "области", определенные модулями, существуют в основном во время компиляции. Во время выполнения все это один большой беспорядок;) Это используется большинством контейнеров МОК, и они не заботятся о том, где они находятся. Контейнер IoC для веб-приложения обычно создается на самом удаленном уровне (очень близко к самому веб-контейнеру).
Верно, что вы могли бы создать его в любом месте, но я бы добавил дополнительный слой, позвольте ему назвать его 3.5.
В вашем текущем 3 будет находиться ваш IoC для доступа к данным - это станет оберткой для вашего фактического DAL. Основываясь на вашей конфигурации, 3 создаст либо макет репозитория, либо конкретный.
Итак, 2 все еще ссылаются на 3, но это просто интерфейс к фактическому DAL, который настроен через вашу инфраструктуру IoC.
В качестве альтернативы вы можете перевернуть свой собственный "el-cheapo" IoC - изменить свой большой угрюмый синглтон на статический шлюз - Тестирование контейнера IoC за синглтоном - не так ли?