2015-05-25 26 views
7

~ TLDR: Wdrażam rozwiązanie CQRS + DDD dla jednego z moich większych projektów, i zastanawiam się, czy istnieje prawdziwy powód, dla którego moje programy obsługi komend nie mogą bezpośrednio wysyłać obiekt polecenia do moich agregatów, w niewielkiej liczbie przypadków, gdzie obiekt polecenia jest bogaty w dane? Nie mogę znaleźć żadnego konkretnego powodu, dla którego miałby to być jakiś anty-wzór, i nie mogę znaleźć żadnych opinii, które szczegółowo opisują ten typ projektu.Przekazywanie komend CQRS bezpośrednio do obiektów Domain

Tło: Zaimplementowałem już systemy CQRS i mam wdrożone aplikacje DDD, ale nigdy CQRS + DDD w odpowiedniej aplikacji opartej na domenie stylu Eric Evans. Pytam więc, ponieważ nie chcę nadużywać moich Agregatów i zranić mojego wniosku na dłuższą metę.

Przykładem mojego obiektu polecenia zawierającego sporo danych byłoby polecenie rejestracji, które obejmuje 8 + pola (imię, nazwisko, preferowana nazwa, imię i nazwisko, tytuł, nazwa użytkownika, hasło, dział itp.). Czuję się bardzo niezręcznie tworząc na moim Aggregate metodę, która ma 8 par, a alternatywne rozwiązanie użycia jakiegoś dto, a mój przewodnik mapuje polecenie do dto - albo automagicznie używając automappera, albo inline - wydaje się niepotrzebnym i abstrakcja bez wartości dodanej.

Mogę również zobaczyć przyszłe przypadki użycia, w których polecenia mogą być bogate w dane (nie będzie to duży procent poleceń, ale wciąż będzie ich kilka), więc chciałbym, aby ten pozornie banalny aspekt był poprawny od początku.

+0

O ile pamiętam, DDD nie mówi dokładnie, jak zaimplementować model domeny, ale robi to CQRS. Brak konfliktu tutaj. Odnośnie prostych obiektów poleceń, w jaki sposób przekazałeś je do Aggregates? Sądzę, że masz abstrakcję/interfejs, od których oba zależą. – neleus

+0

Przekazuję dane polecenia (nie rzeczywisty obiekt komend) do agregatu za pośrednictwem parametrów. Polecenie jest odbierane przez program obsługi, który ładuje agregat i po prostu przekazuje mu to, czego potrzebuje, za pomocą odpowiednio zaprojektowanej metody. Zwykle jest to tylko jeden lub kilka parametrów, tak jak lubię, ponieważ uważam, że dobrze zaprojektowany agregat powinien mieć metody, które wymagają bardzo niewielu parametrów. W przeciwnym razie prawdopodobnie w jakiś sposób narusza SRP. Ale są * niektóre * przypadki krawędzi, w których może być wymaganych wiele parametrów. – AaronHS

+0

Czy rozważałeś przekazanie całego obiektu polecenia do Aggregate? Wygląda to prosto, bez wad. – neleus

Odpowiedz

10

Obiekty poleceń są zwykle wyrażane w typach pierwotnych, a sygnatury agregatów metod są wyrażane w koncepcjach dziedzinowych.

Fakt, że nie od razu rozpoznajesz, prawdopodobnie oznacza, że ​​przegapiłeś wiele okazji do wyraźnego wyrażenia swoich domysłów.

"komenda rejestracja że bierze w 8+ pól (imię, nazwisko, preferowane nazwisko, data urodzenia, tytuł, nazwa użytkownika, hasło, towarowych itp)"

co należy uderzać że firstname i lastname może z pewnością tworzyć znaczącą całość, taką jak new FullName(firstname, lastname) i jestem pewien, że istnieje wiele innych przypadków, w których obiekty Value (VO) mogą lub powinny być używane w twojej domenie ... Username, Password, itp.? Używanie VO do modelowania rzeczy, które się razem zmieniają, lepiej opisuje twój model, a także zmniejsza liczbę argumentów, które musisz przekazać.

W związku z tym obiekty poleceń są słabymi kandydatami jako argumenty metody agregacji. Jeśli pójdziesz tą drogą, na pewno przegapisz możliwości modelowania.

+0

To ma sens. Dziękuję za odpowiedź, a także jasne wyjaśnienie, dlaczego * dlaczego * – AaronHS

2

Zgadzam się z @plalx.

Podejmowanie komend, ponieważ argumenty metody agregacji mogą prowadzić do posiadania zbyt wielu kodów odwzorowań wewnątrz agregatów: Odwzorowywanie typów pierwotnych na obiekty domenowe, które lepiej jest umieszczać poza obiektami domeny.

Ale dla prostszych projektów uważam, że to dobry starter.

W przypadku rejestracji kontekst ograniczony jest zwykle domeną pomocniczą, a złożoność zwykle pochodzi z integracji zewnętrznej (powiadomienie e-mail, rejestracja przy użyciu kont społecznościowych itp.). W tym przypadku myślę, że ograniczona kontekstowa integracja jest ważniejsza niż modele wewnątrz. Przyjmuj polecenia, ponieważ argumenty metod agregacji mogą być szybkim początkiem, aby załatwiać sprawy i oszczędzać czas, aby skupić się na swojej głównej domenie.