Czy to dobra struktura rozwiązania Visual Studio dla usługi internetowej RESTful opartej na domenie?


15

Buduję .NET 4.5 C # Web API RESTful rozwiązanie i chciałbym, aby ktoś mi powiedział, czy moje rozwiązanie projektu jest poprawne i / lub mądre (-wystarczy?) Dla rozwiązania zaprojektowanego przy użyciu Domain Driven Design, proszę.

Rozwiązanie zostało podzielone na 6 projektów:

  • /Baza

(Niczego nie ma)

Projekt internetowy stanowi interfejs między rozwiązaniem a światem zewnętrznym. Zawiera kontrolery Web API. Nie zawiera prawie żadnej logiki poza zbieraniem wartości z obiektów żądania i proszeniem warstwy BizApi o pracę.

  • /Biz.Api

(Referenced by Base])

Zapewnia usługi domenowe i umożliwia projektowi interfejsu / Base dostęp do obiektów logiki biznesowej domeny w projekcie /Biz.Domain.

  • /Biz.Domain

(Odwołany przez Biz.Api)

Udostępnia klasy domen dla warstwy Biz.Api. Zapewniają one metody manipulowania danymi firmy w pamięci.

  • /Dal.Db

(Odwołany przez Biz.Api)

Warstwa repozytorium bazy danych. Dostęp do baz danych i map zwróconych danych do wewnętrznych DTO zdefiniowanych w warstwie / Interfejsy.

  • /Dal.Services

(Odwołany przez Biz.Api)

Zapewnia warstwę proxy do zewnętrznych zależności, takich jak usługi sieciowe, i odwzorowuje ich zwrócone dane na wewnętrzne DTO zdefiniowane w projekcie / Interfaces.

  • / Interfejsy

(Odwołanie w większości projektów powyżej)

Zawiera klasy DTO do przesyłania danych wokół rozwiązania oraz interfejsy C # do definiowania umów na rzeczy takie jak IoC.


„/Biz.Api świadczy usługi domenowe”: masz na myśli usługi aplikacyjne? Ponadto repozytoria zazwyczaj nie zwracają DTO, ale jednostki (zagregowane katalogi główne).
— Warto

Tak, mam na myśli usługi aplikacji. Repozytoria zwracają instancje klas, które jedynie przechowują dane - dane te są mapowane na instancję przy użyciu, w tym przypadku, AutoMapper. Zwrócona instancja nie ma żadnych metod manipulacyjnych, które, jak uważam, mają Encje.
— Matt W

„te dane są zmapowane”: między czym a czym? Co rozumiesz przez „manipulowanie metodami”?
— guillaume31,

Odpowiedzi:


22

Ta struktura folderów została zainspirowana słynną książką projektową Vaugh Vernon opartą na domenie Implementing .

Rozwiązanie:
├ WebService (REST Usługi rezydują tutaj)
├ WebServiceTests
├ aplikacji (Application Services rezydują tutaj)
├ ApplicationTests
├ Domain (Podmioty, VO, usługi domenowe, fabryki domen, specyfikacje, imprezy domen, interfejsy Przechowalnie, infrastruktura usługi interfejsy)
├ DomainTests
├ Infrastruktura (repozytoria, usługi infrastrukturalne, adaptery do usług zewnętrznych)
└ Testy infrastruktury

Zaczynam od Rozwiązania, następnie tworzę cztery projekty dla każdej warstwy w mojej aplikacji, a następnie kolejne cztery projekty dla każdej warstwy testowej.

Nie twórz folderów interfacesani servicesw swojej warstwie domeny, zamiast tego pokrewne klasy powinny być pogrupowane według funkcji w modułach.


1

Jeśli chodzi o strukturę, wydaje mi się to w porządku, chociaż wymyśliłbym inne, bardziej samoopisujące nazwy, takie jak "YourProjectWebApi"zamiast "Base", "Dal.External"zamiast "Dal.Services"i tak dalej.

W części „wewnętrzny DTO” może wyczuć zapach, ponieważ powinieneś wydobywać jednostki z repozytoriów i móc bezpośrednio na nich podejmować działania domenowe (biznesowe). Podmioty to nie tylko DTO.

W pewnym sensie czerpię z faktu, że Dal.Dbnie ma zależności od Biz.Domain,tego, że warstwa domeny wykonuje pewne mapowanie między DTO z projektu Interfejsy (zwrócone przez repozytoria?) A własnymi obiektami domeny. Nie byłoby to poprawne w typowej najnowocześniejszej (== „cebulowej” lub „heksagonalnej”) architekturze DDD - warstwa domeny nie powinna odwoływać się do innych projektów. Z tego samego powodu interfejsy repozytorium powinny być deklarowane w domenie, a nie w, Interfacesjak sądzę, są.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.