Ist dies eine gute Visual Studio-Lösungsstruktur für einen REST-fähigen Webdienst mit domänengesteuertem Design?

15

Ich erstelle eine .NET 4.5 C # Web-API-REST-Lösung und möchte, dass jemand mir mitteilt, ob meine Projektlösung für eine mit Domain Driven Design entworfene Lösung korrekt und / oder sinnvoll (-genügend?) Ist.

Die Lösung wurde in 6 Projekte aufgeteilt:

  • /Base

(Von nichts referenziert)

Das Webprojekt und bildet die Schnittstelle zwischen der Lösung und der Außenwelt. Enthält die Web-API-Controller. Enthält fast keine Logik, außer Werte von Anforderungsobjekten zu erfassen und die BizApi-Ebene um Arbeit zu bitten.

  • /Biz.Api

(Referenziert von Base)

Stellt die Domänendienste bereit und ermöglicht dem Schnittstellenprojekt / Base den Zugriff auf die Geschäftslogikobjekte der Domäne im Projekt /Biz.Domain.

  • /Biz.Domain

(Referenziert von Biz.Api)

Stellt die Domänenklassen für die Biz.Api-Ebene bereit. Diese bieten Methoden zum Bearbeiten der Geschäftsdaten im Arbeitsspeicher.

  • /Dal.Db

(Referenziert von Biz.Api)

Die Datenbank-Repository-Schicht. Greift auf die Datenbanken zu und ordnet die zurückgegebenen Daten internen DTOs zu, die in der Ebene / Interfaces definiert sind.

  • /Dal.Services

(Referenziert von Biz.Api)

Stellt eine Proxy-Ebene für externe Abhängigkeiten wie Webdienste bereit und ordnet die zurückgegebenen Daten internen DTOs zu, die im Projekt / Interfaces definiert sind.

  • / Schnittstellen

(Von den meisten oben genannten Projekten referenziert)

Enthält die DTO-Klassen zum Weitergeben von Daten in der Lösung und die C # -Schnittstellen zum Definieren von Verträgen für Dinge wie IoC.

Matt W
quelle
"/Biz.Api Stellt die Domänendienste bereit": Meinen Sie Anwendungsdienste? Außerdem geben Repositorys in der Regel keine DTOs zurück, sondern Entitäten (Aggregatwurzeln). Und Abhängigkeiten zwischen diesen Projekten wären auch gut zu wissen;)
guillaume31
Ja, ich meine App Services. Die Repositorys geben Instanzen von Klassen zurück, die nur Daten speichern. Diese Daten werden mithilfe von AutoMapper in die Instanz abgebildet. Die zurückgegebene Instanz verfügt über keine Manipulationsmethoden, über die Entities verfügen.
Matt W
"diese daten werden abgebildet": zwischen was und was? Was meinen Sie mit "Methoden manipulieren"?
guillaume31

Antworten:

22

Diese Ordnerstruktur ist inspiriert von dem berühmten Implementing Domain Driven Design Book von Vaugh Vernon.

Lösung:
├ WebService (REST Services befinden sich hier)
├ WebServiceTests
├ Anwendung (Application Services befinden sich hier)
├ ApplicationTests
├ Domain (Entities, VO, Domain - Services, Domain Fabriken, Spezifikationen, Domain - Veranstaltungen, Repositorys Schnittstellen, Infrastruktur - Services - Schnittstellen)
├ DomainTests
├ Infrastruktur (Repositories, Infrastructure Services Impl., Adapter auf externe Services)
└ InfrastructureTests

Ich beginne mit einer Lösung, erstelle dann vier Projekte für jede Ebene in meiner Anwendung und teste dann weitere vier Projekte für jede Ebene.

Erstellen Sie keinen Ordner interfacesoder servicesin Ihrer Domänenebene, stattdessen sollten verwandte Klassen nach Funktionen in Modulen gruppiert werden.

Songo
quelle
1

Was die Struktur angeht, scheint es mir in Ordnung zu sein, obwohl ich mir andere, selbsterklärendere Namen ausgedacht hätte, wie zum Beispiel "YourProjectWebApi"anstelle von "Base", "Dal.External"anstelle von "Dal.Services"und so weiter.

Es kann jedoch ein Geruch im "internen DTO" -Teil auftreten, da Entitäten aus Repositorys entfernt werden sollen und Domänen- (Geschäfts-) Aktionen direkt auf sie angewendet werden können. Entitäten sind nicht nur DTOs.

Ich gehe von der Tatsache aus, dass die Domain-Schicht Dal.Dbkeine Abhängigkeit davon hat, Biz.Domain,dass sie eine Zuordnung zwischen DTOs aus dem Interfaces-Projekt (von Repositories zurückgegeben?) Und ihren eigenen Domain-Objekten vornimmt. Dies wäre in einer typischen DDD-Architektur nach dem Stand der Technik (== "Zwiebel" oder "Sechseck") nicht korrekt - die Domänenschicht sollte nicht auf andere Projekte verweisen. Aus dem gleichen Grund sollten Repository-Schnittstellen in der Domäne deklariert werden und nicht so, Interfaceswie ich es denke.

guillaume31
quelle