Jesteś na dobrej drodze o DDD w zależności od tego, jak cienkie/grube są warstwy serwisowe domeny &. DDD mówi, że wiedza (tj. Logika biznesowa) powinna zostać wkomponowana w model domeny. Przeniesienie problemów z dostępem do danych do DAL jest zgodne z DDD, ale myślę, że przeniesienie logiki biznesowej do warstwy usług nie jest. Jeśli masz cienką warstwę "modelu danych" domeny (głównie dla encji) i grubą warstwę usług (głównie dla "logiki biznesowej"), możesz mieć anemic domain.
Ponadto, nie ma technicznej "warstwy serwisowej" w DDD. Może istnieć "warstwa aplikacji", ale powinna być cienka i odpowiedzialna tylko za przepływ aplikacji/zarządzanie okresami życia domeny. Jest to w zasadzie to, co kontrolery robią w .NET MVC, zarządzają przepływem aplikacji w kontekście web http.
Jeśli wypchnięcie całej logiki wewnątrz Modelu sprawiłoby, że twój kod byłby zbyt skomplikowany, chciałbym usłyszeć przykłady tego, co masz na myśli przez "zbyt skomplikowane". Możesz poprawnie modelować złożoną domenę lub są szanse, że możesz przejść do wzorców DDD, aby nieskomplikowane rzeczy. Powiedziałbym, że jak podałeś to w swoim pytaniu, łuk nie jest DDD. Nazwałbym to po prostu "architekturą warstwową", ale to dlatego, że wolę używać terminu "warstwa" tylko wtedy, gdy mówimy o fizycznym łuku. Jednak twoja logiczna architektura jest warstwowa.
Bardzo podoba mi się to, że Darin w swojej odpowiedzi łączył się z łukiem cebulowym. Staję się wielkim fanem tego i uważam, że nie jest to wyłączne dla DDD.Jeśli twój kod wykorzystuje wtrysk zależności do rozwiązywania zależności interfejsu z implementacjami środowiska wykonawczego, możesz mieć postać łuku cebuli. Na przykład, czy definiujesz jakieś interfejsy w swoim DAL? Czy implementacje tych interfejsów zostały rozwiązane w czasie wykonywania?
Oto przykład łuku, z którego zaczynam korzystać w moich nowych projektach. Jest to kombinacja cebuli + DDD:
API
Projektu/Konstrukcja: generyczne interfejsy, teksty stałe, klasy, i rozszerzenie metod stosowanych przez wszystkich innych warstw. Nie musi być oddzielony od domeny, ale może.
Domain
Projekt/Zgromadzenie: wszystkie podmioty i logika biznesowa. Zależy tylko od API
. Używa wzorców DDD, takich jak fabryka, usługa, specyfikacja, repozytorium itp. Zawiera również więcej interfejsów specyficznych dla domeny, które nie są zdefiniowane w interfejsie API.
Impl
Projekt/złożenie: implementacje interfejsów zdefiniowanych w API
i Domain
. W tym miejscu implementowany jest EF DbContext, a także takie funkcje, jak rejestrowanie, wysyłanie wiadomości e-mail itp. Wszystkie te implementacje są zależne od wtyczki, więc technicznie możesz mieć kilka projektów/złożeń Impl.
UI
Projekt/złożenie: To jest projekt MVC. Kontrolery pobierają powierzchnię domeny bezpośrednio i nie przechodzą przez warstwę aplikacji lub usługi. Wszelkie zależności między interfejsami w fabrykach, usługach, repozytoriach itp. Są wprowadzane do domeny przez kontroler za pomocą MVC IoC (iniektor konstruktora).
Umieściłem warstwę API w samym rdzeniu, ale można połączyć projekty API i Domain w jeden. Tak czy inaczej, duża mięsista część cebuli jest Domeną i ma wewnętrzną warstwę. Na przykład Usługi mogą zależeć od Fabryk, które zależą od Repozytoria, które zależą od Podmiotów.
Projekt Impl jest tym, co widać na skórze cebuli "Infrastruktura" na diagramie Palermo. Jest na zewnętrznej krawędzi wraz z interfejsem użytkownika i nie zawiera żadnej wiedzy specyficznej dla danej domeny. Wie, jak wysyłać wiadomości e-mail, przechowywać/pobierać dane za pomocą EF itd. Jeśli chcesz, możesz mieć więcej niż 1 z nich - na przykład 1 Impl dla dostępu do danych, 1 Impl dla obsługi poczty itp.
MVC ma kontrolery i widoki i koncentruje się na interfejsie użytkownika i przepływie aplikacji internetowych. Wszystko, co wymaga wiedzy specyficznej dla domeny, jest delegowane do domeny, a klasy domen są konstruktorami wstrzykiwanymi do kontrolera. Oznacza to, że interfejsy wstrzykiwane przez konstruktora w klasach domen są automatycznie rozwiązywane przez kontener IoC.
Jako ostatnia uwaga, programowanie na interfejsach zdefiniowanych w API i klasach Domen oznacza, że możesz jednostce przetestować projekt domeny oddzielnie od projektu MVC.
Czy masz jakieś dobre przykłady projektów ASP.NET MVC opartych na DDD? Lub te, które wykorzystują architekturę, którą opisujesz? Próbowałem odczytać kod z tylu projektów ASP.NET MVC, ile tylko mogę, aby zebrać informacje o stosowanych praktykach, ale jest to niezwykle trudne. –
Chciałbym z tobą porozmawiać na czacie przed opublikowaniem odpowiedzi na Twój komentarz: http://chat.stackoverflow.com/rooms/9000/danludwig-private-room – danludwig
Tak interesująca odpowiedź! Nie wiem, jak Google polecił mi ten stary post, ale jest naprawdę dobry. Czy mógłbyś napisać artykuł w Code Project dotyczący DDD i Cebulowej Architektury na przykładzie :) A może już to zrobiłeś: D – Celdor