Moja firma przepisuje naszą aplikację internetową od zera. Jest to aplikacja dla dużych przedsiębiorstw ze złożoną domeną w branży finansowej.
Używamy ORM (Entity Framework) do utrwalania.
Zasadniczo połowa naszych aplikacji skupia się na gromadzeniu nieprzetworzonych danych od użytkownika, przechowywaniu ich, a następnie druga połowa aplikacji, która zawiera większość naszej rzeczywistej logiki domeny, bierze te surowe dane, aby stworzyć nasz obraz domeny, który różni się znacznie od tych oryginalnych surowe dane wejściowe i przekazuje je do silnika obliczeniowego, uruchamia cielęta i wypluwa wyniki, które są następnie wyświetlane użytkownikowi.
W podejściu DDD z wykorzystaniem warstw wydaje się, że operacje CRUD przechodzą przez warstwę domeny. ale przynajmniej w naszym przypadku nie wydaje się to mieć sensu.
Gdy użytkownik przechodzi na przykład do ekranu edycji, aby na przykład zmienić rachunek inwestycyjny, pola na ekranie to dokładne pola przechowywane w bazie danych, a nie reprezentacja domeny używana później do obliczeń. Dlaczego więc miałbym ładować reprezentację domeny rachunku inwestycyjnego, kiedy ekran edycji wymaga reprezentacji bazy danych (surowe dane wejściowe)?
Gdy użytkownik kliknie „Gotowe” na ekranie rachunku inwestycyjnego, a POST zostanie wykonany dla kontrolera, kontroler ma teraz dokładną reprezentację bazy danych rachunku inwestycyjnego, którą musi zapisać. Ale z jakiegoś powodu powinienem załadować reprezentację domeny, aby dokonać modyfikacji, zamiast po prostu mapować model kontrolera bezpośrednio do modelu bazy danych (model szkieletowy Entity)?
Zasadniczo odwzorowuję model danych na model domeny, tak aby można go było odwzorować z powrotem na model danych, aby zachować. W jaki sposób to ma sens?
Krótka odpowiedź: nie .
Dłuższa odpowiedź: ciężkie wzorce do opracowania modelu domeny nie dotyczą tych części rozwiązania, które są tylko bazą danych.
Udi Dahan miał ciekawe spostrzeżenie, które może pomóc to wyjaśnić
W końcu model domeny ma zapewnić, że wszystkie aktualizacje danych zachowają bieżący niezmiennik biznesowy. Innymi słowy, model domeny jest odpowiedzialny za zapewnienie poprawności bazy danych, która działa jak system zapisu .
Kiedy masz do czynienia z systemem CRUD, zwykle nie jesteś systemem zapisu danych. Świat rzeczywisty to księga rekordów, a twoja baza danych to tylko lokalna pamięć podręczna reprezentacji świata rzeczywistego.
Na przykład większość informacji pojawiających się w profilu użytkownika, takich jak adres e-mail lub numer identyfikacyjny wydany przez rząd, ma źródło prawdy, które mieszka poza Twoją firmą - to administrator poczty innej osoby przypisuje i odwołuje adresy e-mail, a nie twoja aplikacja. To rząd przypisuje numery SSN, a nie Twoja aplikacja.
Dlatego zwykle nie będziesz przeprowadzać walidacji domen na danych przychodzących do ciebie ze świata zewnętrznego; możesz mieć kontrole, aby upewnić się, że dane są poprawnie sformułowane i odpowiednio zdezynfekowane ; ale to nie twoje dane - Twój model domeny nie otrzymuje weta.
Tak jest w przypadku, gdy baza danych jest księgą rekordów .
Ouarzy tak to ujął .
Używamy modelu domeny do zarządzania danymi należącymi do domeny; dane spoza domeny są już zarządzane gdzie indziej - po prostu buforujemy kopię.
Greg Young wykorzystuje systemy magazynowe jako główną ilustrację rozwiązań, w których księga rekordów znajduje się gdzie indziej (np. Podłoga magazynu). Implementacja, którą opisuje, jest bardzo podobna do twojej - jedna logiczna baza danych do przechwytywania wiadomości otrzymanych z magazynu, a następnie osobna logiczna baza danych buforująca wnioski wyciągnięte z analizy tych wiadomości.
Może. Nie chciałbym oznaczać go jako kontekstu ograniczonego, ponieważ nie jest jasne, jaki inny bagaż jest z nim związany. Możliwe, że masz dwa konteksty, może to być jeden kontekst z subtelnymi różnicami we wszechobecnym języku, którego jeszcze nie znasz.
Możliwy test lakmusowy: ilu ekspertów domeny potrzebujesz dwóch ekspertów domeny, aby objąć to spektrum, lub tylko jednego, który mówi o komponentach na różne sposoby. Zasadniczo możesz odgadnąć, ile masz ograniczonych kontekstów, cofając prawo Conwaya.
Jeśli uważasz, że ograniczone konteksty są dostosowane do usług, może to być łatwiejsze: czy możesz mieć możliwość niezależnego wdrożenia tych dwóch funkcji? Tak sugeruje dwa ograniczone konteksty; ale jeśli muszą być zsynchronizowane, może to tylko jeden.
źródło
W swojej domenie nie powinieneś wiedzieć, że baza danych w ogóle istnieje.
Twoja domena dotyczy reguł biznesowych. Rzeczy, które muszą przetrwać, gdy firma, która stworzyła bazę danych, przestaje działać. To znaczy, jeśli chcesz, aby Twoja firma przetrwała. To naprawdę miłe, gdy te zasady nie dbają o to, że zmieniłeś sposób przechowywania danych.
Dane dotyczące bazy danych istnieją i należy się nimi zająć. Powinni mieszkać gdzie indziej. Umieść je przez granicę. Ostrożnie kontroluj, w jaki sposób komunikujesz się przez tę granicę, w przeciwnym razie nie jest to granica.
Wujek Bob ma to do powiedzenia na temat tego, w co umieścić swoje dane:
Wyjaśnia również, w jaki sposób zewnętrzne warstwy powinny być wtyczkami do wewnętrznych warstw, aby wewnętrzne warstwy nawet nie wiedziały, że istnieją zewnętrzne.
Wykonaj coś takiego, a będziesz mieć dobre miejsce do zignorowania bazy danych, w której możesz martwić się o reguły sprawdzania poprawności danych wejściowych, reguły, które trzeba w jakiś sposób utrwalić, reguły uruchamiania obliczeń, reguły wysyłania tych wyników do dowolnego wyniku. W rzeczywistości łatwiej jest odczytać tego rodzaju kod.
Albo to, albo zdecydujesz, że twoja domena jest po prostu do manipulowania bazą danych. W takim przypadku Twoim językiem domeny jest SQL. Jeśli tak dobrze, ale nie oczekuj, że wdrożenie reguł biznesowych przetrwa zmianę trwałości. Będziesz musiał całkowicie je przepisać.
źródło
Zastosowanie teorii DDD:
W tej domenie są dwa powiązane konteksty:
Każdy ograniczony kontekst może mieć inny projekt architektoniczny.
Przykład:
Konto inwestycyjne klienta jest Podmiotem (być może Agregatem, zależnym od domeny), a utrwalanie danych odbywa się za pośrednictwem Repozytorium Podmiotu (RDB lub innego typu DB, takiego jak Baza danych OO).
Nie ma podejścia DDD do operacji CRUD. Powiązanie pola DB z danymi obiektu łamie zasady projektowania.
źródło