Каково ваше мнение о следующей "общей" кодовой первой архитектуре ASP.NET MVC, разработанной Onion:
Слои, объясненные:
Core - содержит модель домена. например что бизнес-объекты и их отношения. Я использую Entity Framework для визуального проектирования объектов и отношений между ними. Это позволяет мне генерировать script для базы данных. Я получаю автоматически созданные POCO-подобные модели, на которые я могу свободно ссылаться на следующем уровне (Persistence), поскольку они просты (т.е. Они не зависят от базы данных).
Персистирование - интерфейс и реализации репозитория. В основном операции CRUD в модели домена.
BusinessServices - бизнес-уровень вокруг репозитория. Вся бизнес-логика должна быть здесь (например, GetLargestTeam()
и т.д.). Использует операции CRUD для создания возвращаемых объектов или получения/фильтрации/хранения данных. Должны содержать все бизнес-правила и проверки.
Веб (или любой другой пользовательский интерфейс). В этом конкретном случае это приложение MVC, но идея этого проекта заключается в предоставлении пользовательского интерфейса, основанного на том, что предлагают бизнес-услуги. Проект пользовательского интерфейса потребляет бизнес-уровень и не имеет прямого доступа к репозиторию. Проект MVC имеет свои собственные модели просмотра, которые являются специфическими для каждой ситуации просмотра. Я не пытаюсь принудительно подавать его в доменные модели.
Итак, ссылки выглядят так: UI → Бизнес-услуги → Репозиторий → Основные объекты
Что мне нравится:
- Я могу конструировать свои объекты, а не закодировать их вручную. я осознаю созданных кодом объектов Model.
- Пользовательский интерфейс управляется/выполняется слой. Различные приложения пользовательского интерфейса могут быть закодированы против того же Бизнес-модель.
Смешанные чувства о:
- Хорошо, у нас есть реалистичная реализация репозитория, но как часто у вас действительно разные реализации одного и того же интерфейса настойчивости?
- То же самое касается интерфейса - у нас есть технические возможности для реализации различных приложений пользовательского интерфейса по тем же бизнес-правилам, но зачем нам это делать, когда мы можем просто визуализировать разные виды (мобильные, настольные и т.д.)?
- Я не уверен, что пользовательский интерфейс должен только взаимодействовать с бизнес-слоем через модели просмотра, или я должен использовать модели доменов для передачи данных, как и сейчас. Для отображения я использую модели просмотра, но для передачи данных я использую модели домена. Неправильно?
Что мне не нравится:
- Проект Core теперь ссылается во всех других проектах - потому что я хочу/должен получить доступ к моделям Домен. В классической архитектуре лука на ядре ссылается только следующий слой.
- DbContext реализован в проекте .Core, поскольку он генерируется Entity Framework в том же месте, где находится .edmx. Я действительно хочу использовать .EDMX для визуального моделирования модели, но я чувствую, что DbContext принадлежит к слою Persistence, где-то внутри реализации репозитория конкретной базы данных.
В качестве окончательного вопроса - что такое хорошая архитектура, которая не слишком переработана (например, полноразмерный лук, где у нас есть инъекции, локаторы сервисов и т.д.), но в то же время обеспечивает некоторую разумную гибкость, в местах где вам это реально нужно?
Спасибо