Я создаю решение RESTful для .NET 4.5 C # Web API, и я хотел бы, чтобы кто-нибудь сказал мне, является ли мое проектное решение правильным и / или мудрым (достаточно?) Для решения, разработанного с использованием доменного дизайна, пожалуйста.
Решение было разделено на 6 проектов:
- /База
(Ничего не указано)
Веб-проект и формирует интерфейс между решением и внешним миром. Содержит контроллеры Web API. Почти не содержит логики, кроме сбора значений из объектов запроса и запроса уровня BizApi для работы.
- /Biz.Api
(Ссылка на базу])
Предоставляет доменные службы и позволяет проекту интерфейса / Base иметь доступ к объектам бизнес-логики домена в проекте /Biz.Domain.
- /Biz.Domain
(Ссылка на Biz.Api)
Предоставляет доменные классы для слоя Biz.Api. Они предоставляют методы для манипулирования данными бизнеса в памяти.
- /Dal.Db
(Ссылка на Biz.Api)
Уровень хранилища базы данных. Получает доступ к базам данных и отображает возвращенные данные во внутренние DTO, определенные на уровне / Interfaces.
- /Dal.Services
(Ссылка на Biz.Api)
Предоставляет прокси-слой для внешних зависимостей, таких как веб-службы, и отображает их возвращенные данные во внутренние DTO, определенные в проекте / Interfaces.
- / Интерфейсы
(Ссылка на большинство проектов выше)
Содержит классы DTO для передачи данных вокруг решения и интерфейсы C # для определения контрактов для таких вещей, как IoC.
источник
Ответы:
Эта структура папок навеяна знаменитой книгой Внедрения Версии, основанной на домене .
Решение:
├ WebService (здесь находятся службы REST)
├ WebServiceTests
├ Приложение (здесь находятся службы приложений)
├ ApplicationTests
├ Домен (сущности, VO, доменные службы, доменные фабрики, спецификации, доменные события, интерфейсы репозиториев, интерфейсы сервисов инфраструктур)
├ DomainTests
├ Инфраструктура (репозитории, включая инфраструктурные сервисы, адаптеры для внешних сервисов)
└ Инфраструктурные тесты
Я начинаю с решения, затем создаю четыре проекта для каждого слоя в моем приложении, а затем еще четыре проекта для каждого слоя тестов.
Не создавайте папку
interfaces
илиservices
слой вашего домена, вместо этого связанные классы должны быть сгруппированы по функциональности в модулях.источник
Что касается структуры, мне кажется, что все в порядке, хотя я бы придумал другие, более информативные имена, например,
"YourProjectWebApi"
вместо"Base"
,"Dal.External"
вместо"Dal.Services"
и так далее.Однако во внутренней части DTO может быть какой-то запах, так как вы должны извлекать сущности из репозиториев и иметь возможность предпринимать действия с доменом (бизнесом) непосредственно над ними. Сущности не просто DTO.
Я как бы понял из того факта, что
Dal.Db
он не зависит отBiz.Domain,
того, что слой Domain выполняет какое-то отображение между DTO из проекта Interfaces (возвращаемого репозиториями?) И его собственными объектами Domain. Это было бы неправильно в типичной современной архитектуре DDD (== "onion" или "hexagonal") - уровень домена не должен ссылаться на другие проекты. По той же причине интерфейсы репозитория должны быть объявлены в домене, а не в томInterfaces
виде, в котором, я думаю, они находятся.источник