Зависимости модуля
Я изучаю AutoFac. Мне нравится идея модулей. Из моего понимания я мог, например, создать модуль, который регистрирует некоторую часть зависимостей моего приложения в контейнере, чтобы создать некоторую абстракцию над ним. Однако я не знаю, что делать в ситуациях, когда у меня несколько модулей.
Прежде всего, я должен создать отдельный модуль LoggerModule только для этого:
builder.RegisterType< 'MyLogger>() As<' ILogger>();
Или это должно быть прямо поставлено в корень композиции? Вопрос возникает из-за моей путаницы, стоит ли регистрировать модули (более высокая абстракция) и сервисы (более низкая абстракция) на одном и том же уровне корня композиции. Должны ли модули создаваться только для сервисов, которые используют много зависимостей, чтобы упростить регистрацию на корневом уровне композиции?
Другое дело: как насчет других моих модулей, которые регистрируют сервисы, требующие ILogger? Должен ли я просто предположить, что ILogger уже зарегистрирован и просто c.Resolve<'ILogger>(), или я должен зарегистрировать его снова, чтобы в каждом модуле были зарегистрированы все необходимые зависимости?
Могу ли я создать модуль, который регистрирует другие модули?
Я пытался найти ответы на эти вопросы, но нашел только темы, которые были близки, но не совсем касались моей проблемы.
1 ответ
Думайте о модулях как о транспортных средствах для конфигурации, а не как о компонентах вашего приложения. Они существуют для настройки контейнера с компонентами, от которых будет зависеть ваше приложение. Имея это в виду:
- Конечно. Нет причин, по которым модуль не должен существовать для одной цели (например, для настройки регистрации в контейнере). Однако часто ведение журнала является настолько фундаментальным сервисом, что обычно он "встроен" в корень (или оболочку) приложения.
- Другие компоненты должны просто предполагать, что ведение журнала доступно, и что ответственность за его настройку несет кто-то другой. Это суть внедрения зависимости - если требуемые сервисы недоступны, ваше приложение не может работать.
- Это технически возможно, но я бы не стал этого делать. Постарайтесь думать о модулях как о независимых и не зависящих друг от друга. В сложных приложениях возможно, что порядок загрузки модулей при запуске важен, но я считаю, что детали реализации не должны влиять на архитектурные абстракции.