Це хороша структура рішень Visual Studio для дизайну RESTful веб-сервісу, орієнтованого на домен?


15

Я будую. NET 4.5 C # Веб-API RESTful рішення, і я хотів би, щоб хтось сказав мені, чи моє проектне рішення правильне та / або розумне (-достатньо?) Для рішення, розробленого з використанням доменного управління, будь ласка.

Рішення було розділено на 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.


"/Biz.Api надає послуги домену": ви маєте на увазі Служби прикладних програм? Крім того, сховища зазвичай не повертають DTO, а сутності (сукупні корені). І про залежності між цими проектами також було б добре знати;)
guillaume31

Так, я маю на увазі Служби додатків. У сховищах повертаються екземпляри класів, які не мають нічого, крім збереження даних - ці дані відображаються в екземпляр, використовуючи, в цьому випадку, AutoMapper. Повернений екземпляр не має методів маніпулювання, які, як я збираю, мають сутності.
Метт W

"ці дані відображені": між чим і чим? Що ви маєте на увазі під "маніпулюючи методами"?
guillaume31

Відповіді:


22

Ця структура папок натхненна знаменитою дизайнерською книжкою " Впровадження домену" від Vaugh Vernon.

Рішення:
├ WebService (REST Services проживає тут)
├ WebServiceTests
├ Application (Служби додатків знаходяться тут)
├ ApplicationTests
├ домен (Сутності, В.О., послуги домену, доменні заводи, технічні характеристики, подія домену, Сховища інтерфейсів, інфраструктури послуг інтерфейси)
├ DomainTests
├ Інфраструктура (сховища, інфраструктурні послуги, адаптери до зовнішніх служб)
└ ІнфраструктураТести

Я починаю з рішення, потім створюю чотири проекти для кожного шару в моєму додатку, потім ще чотири проекти для кожного рівня тестів.

Не створюйте папку interfacesабо servicesу вашому доменному шарі, натомість відповідні класи повинні бути згруповані за функціональністю в модулі.


1

Що стосується структури, то мені здається нормальним, хоча я б придумав різні, більш описові назви, такі як "YourProjectWebApi"замість "Base", "Dal.External"замість "Dal.Services"тощо.

У частині "внутрішнього DTO" може виникнути запах, оскільки ви повинні вийти з репозиторіїв та мати можливість вживати доменних (ділових) дій безпосередньо над ними. Організації - це не лише представники DTO.

Я начебто зважаю на той факт, що Dal.Dbне залежить від того, Biz.Domain,що рівень Домену виконує деяке відображення між DTO з проекту "Інтерфейси" (повертається репозиторіями?) Та його власних об'єктів домену. Це не було б правильно в типовій архітектурі DDD (== "цибуля" або "шестикутна") - доменний рівень не повинен посилатися на інші проекти. З цієї ж причини інтерфейси сховища повинні бути оголошені в Домені, а не в Interfacesтому, як я думаю, що вони є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.