Я читал много примеров кода для DI и autofac.Одна вещь, которую я заметил, состояла в том, что многие люди объединяют интерфейсы и реализации в одном проекте.С точки зрения дизайна, я считаю, что это не правильно, и все интерфейсы должны быть в отдельной сборке.Поэтому я определяю свои проекты следующим образом:
UI - Web App/Windows App/Both
- Views
- Models
- Controllers/ ViewModels
Business
- Services/Processes
- Interfaces
- Model
DataAccess
- Repositories & UoW
- Interfaces
- Model
Таким образом, мои бизнес-сервисы ссылаются только на интерфейсы и модели DataAccess, но остаются независимыми от фактической реализации.Аналогичным образом, пользовательский интерфейс также относится только к бизнес-интерфейсам и моделям, и существует четкое разделение.Это также помогает мне в тестировании, где я могу самостоятельно протестировать слой.
Мой вопрос касается объявления модуля Autofac.Мне нужно настроить мою сборку для копирования реализаций в каталог окончательного развертывания.Мои бизнес-модули должны ссылаться на реализацию доступа к данным, а пользовательский интерфейс должен обращаться к бизнес-модулям.
- Как мне обрабатывать эту цепочку зависимостей в модулях?
- Где разместить классы модулей и как при запуске программы обнаружить все модули самым простым способом?
Я рассматриваю сканирование сборки Autofac, но не уверен, что это единственный вариант,Также обратите внимание, что я уже соблюдаю соглашение об именах и в большинстве случаев я не собираюсь писать отдельные привязки.Меня беспокоит то, что
- , поскольку проекты, ссылающиеся на интерфейсы, не знают о реализациях, я не могу написать какие-либо конкретные привязки в вызывающей сборке, такой как корневая сборка пользовательского интерфейса.
- Некоторые источники говорято чистоте сборок от любых реализаций DI и наличии отдельных сборок для модулей.Это хороший подход для всех типов приложений?(Например, корпоративное LOB-приложение или веб-приложение и настольное приложение ISV, распространяемое среди множества независимых пользователей)