22

Dla aplikacji internetowych (ASP.NET MVC) Jestem obecnie rozwija, mamy następującą architekturę w lokalu:Jakiego rodzaju architektura jest nazywana?

  • Data Access Layer: Logika dla utrzymujących dane do dowolnego db
  • Domain: model danych
  • Service Layer: logika biznesowa (np przetwarzanie zamówień, zarządzanie kontami, etc.)
  • Controller: Zużywa usługi i dostarcza/odbiera dane do/z widokiem
  • View: Interfejs użytkownika dla użytkownika

W istocie, wziąłem Model i podzielić go na DAL, Service Layer i Domain. Czułem, że wypychanie całej logiki wewnątrz Model sprawiło, że mój kod był zbyt skomplikowany. Co więcej, czułem, że pozwala mi to wyrazić czysto logikę biznesową, nie zmuszając kontrolera do zbyt dużej pracy.

Moje pytanie brzmi: Jak nazywa się ten typ architektury?

Jako pytanie dodatkowe: Czy ten rodzaj architektury ma sens? Jeśli nie, czy robię coś nie tak?

Odpowiedz

23

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.

+0

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. –

+0

Chciałbym z tobą porozmawiać na czacie przed opublikowaniem odpowiedzi na Twój komentarz: http://chat.stackoverflow.com/rooms/9000/danludwig-private-room – danludwig

+0

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

4

Mogą występować różne nazwy w zależności od kąta, na który się patrzy. Więc nadal jest to MVC, po prostu twoje M jest podzielone na wiele warstw. Można go również nazwać Multitier architecture (lub architekturą N-warstwową). Jeffrey Palermo również użył pojęcia Onion architecture.

4

Ponieważ oddziela się DAL od modelu domeny, a także posiada warstwę usługi, wygląda na to, że przechodzimy do DDD (projekt oparty na domenie), tutaj jest dyskusja na temat takich an approach, które mogą być przydatne do poznania.

+0

+1 Właśnie o tym myślałem. DDD używane przez aplikację MVC. Zależy od tego, jak cienkie są modele (lub jak grube są usługi). – jgauffin

20

Z wysokiego poziomu opisałbym to jako architekturę warstwową. Opisanie go jako projektu opartego na domenie mogłoby również przyjrzeć się mniejszym wzorom, takim jak agregat, repozytorium, ograniczone konteksty itp. Nie mogę powiedzieć tylko z twojego opisu.

Jeśli warstwa domeny znajduje się w zespole/pakiet, nie odnosi się do jednego z pozostałych, a następnie ma rdzeń Onion Architecture principles, którymi są:

  • Aplikacja wokół niezależny obiekt model
  • Warstwy wewnętrzne definiują interfejsy.Warstwy zewnętrzne wdrożenia interfejsy
  • Kierunek sprzęgła jest w kierunku centrum
  • Wszystko aplikacja Kod rdzeń może być skompilowany i uruchomić odrębny od infrastruktury

konkretna rzecz, szukać jest jeśli odniesienia DataAccess Domain.

Powiązane problemy