DI, Constructor Injection, Модули, шаблоны проектирования - PullRequest
3 голосов
/ 13 сентября 2010

Я столкнулся с некоторыми архитектурными проблемами в проекте, в котором я участвую. Проект представляет собой приложение ASP.NET MVC 2, которое опирается на DI и особенно на инжектор конструктора с Unity. Приложение разделено на несколько модулей (каждый модуль представляет собой набор сборок), предоставляющих сервисы другим модулям. Эти сервисы регистрируются в Unity при запуске приложения. Ничего особенного до сих пор. Допустим, у меня есть это (каждый модуль является сборкой для упрощения):

Модуль A, Модуль B.

Модуль A предоставляет сервис IServiceA следующими способами:

IServiceA (Операция1 - Операция2 - Операция3)

ServiceB от ModuleB нуждается в IServiceA от ModuleA, и он получает его путем внедрения конструктора (с конкретной реализацией). Тогда он использует это.

Проблема в том, что модуль A деактивирован (мы проверяем в базе данных, активирован ли модуль для текущего пользователя при запуске приложения), чтобы serviceA не был зарегистрирован в Unity.

Тогда у нас есть исключение во время выполнения, потому что Unity не может найти регистрацию для IServiceA, а ServiceB не может быть создан. Что нормально.

Я хотел бы знать, что есть набор шаблонов или лучшая практика для борьбы с этим. Первым делом я избавился от инъекции конструктора для ServiceB. Но тогда я должен использовать жесткую ссылку на ServiceA, и мне это не нравится или использовать ServiceLocator, что еще хуже. Я не хочу проверять в ModuleB, доступен ли ServiceA или нет, потому что будет много других сервисов, которые я бы проверил и должен иметь дело с кодом, который является чисто инфраструктурным. Я хотел бы, чтобы ServiceB выполнял тот же код, если serviceA доступен или нет (не знаю, если это возможно). Я посмотрел на схему Gateway, но не знаю, поможет ли это мне.

Любая помощь будет оценена.

Спасибо

1 Ответ

3 голосов
/ 13 сентября 2010

Вам понадобится какая-то реализация по умолчанию , которая может вступить во владение, когда ModuleA деактивирован.Шаблон Null Object звучит как идеальная подгонка.

Просто сначала зарегистрируйте NullServiceA в Unity.Это будет IServiceA по умолчанию, если только он не будет перезаписан реальной реализацией (назовем его ConcreteServiceA).

Для более сложной реализации вы можете обернуть NullServiceA и ConcreteServiceA в Composite или, возможно, в другуюформа Decorator , которая выбирает одно над другим в зависимости от доступности.

Вы можете, например, иметь Composite, который всегда использует первый (или последний) из экземпляров IServiceA, введенных вэто ... или, возможно, критерий выбора мог бы основываться на каких-то метаданных, определяющих, активирован ли модуль или деактивирован (звучит так, что сама эта информация может вписаться в гипотетический интерфейс IModule).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...