Przeczytałem między innymi Evansa, Nilssona i McCarthy'ego i rozumiem koncepcje i rozumowanie związane z projektem opartym na domenie; jednak trudno mi je wszystkie połączyć w prawdziwą aplikację. Brak kompletnych przykładów zmusił mnie do drapania się po głowie. Znalazłem wiele frameworków i prostych przykładów, ale nic tak daleko, że naprawdę pokazuje, jak zbudować prawdziwą aplikację biznesową po DDD.Łączenie kropek z DDD
Na przykładzie typowego systemu zarządzania zamówieniami skorzystaj z przypadku anulowania zamówienia. W moim projekcie widzę OrderCancellationService z metodą CancelOrder, która akceptuje numer zamówienia i powód jako parametry. Ma wtedy wykonać następujące „kroki”:
- Sprawdź, czy bieżący użytkownik posiada niezbędne uprawnienia do anulowania zamówienia
- Odzyskać podmiot zamówienia o określonej kolejności # od OrderRepository
- zweryfikować, Zlecenie może zostać anulowane (w przypadku, gdy zlecenie będzie sprawdzać stan Zamówienia w celu oceny zasad lub w przypadku, gdy Zlecenie będzie miało właściwość CanCancel, która obejmuje zasady?)
- Zaktualizuj stan podmiotu Zamówienia dzwoniąc do Zamówień.)
- Utrzymaj aktualizację d Zamówienie do magazynu danych
- Skontaktuj się z CreditCardService przywrócić żadnych opłat kart kredytowych, które zostały już zrealizowane
- Dodaj wpis audytu dla operacji
Oczywiście, wszystko to powinno się zdarzyć w transakcji i żadna z operacji nie powinna być dozwolona niezależnie. Mam na myśli to, że muszę anulować transakcję kartą kredytową, jeśli anuluję zamówienie, nie mogę anulować i nie wykonać tego kroku. To, imo, sugeruje lepszą enkapsulację, ale nie chcę mieć zależności od usługi CreditCardService w moim obiekcie domeny (Order), więc wydaje się, że to jest odpowiedzialność domeny usługi.
Szukam kogoś, kto pokaże mi przykłady kodu, jak to może/powinno być "zmontowane". Proces myślowy kryjący się za kodem byłby pomocny w doprowadzeniu mnie do połączenia wszystkich kropek dla siebie. Dzięki!
Dlaczego nie chciałbym "wyszukiwania", zarządzania transakcjami i wywoływania zmian w usłudze? Wydaje się, że za każdym razem zapewniałoby właściwe użycie. – SonOfPirate
Wyszukiwanie - może. Zarządzanie transakcjami nie należy do usługi domeny, zwykle jest realizowane w warstwie aplikacji (wywołującej usługę domeny). "Wezwanie do utrzymywania zmian" jest obsługiwane przez ORM lub UnitOfWork, ponieważ zmieniamy istniejące obiekty, których nie wymaga jawne wywołanie w przypadku NHibernate. Chodzi o to, aby kod domeny był jak najbardziej agnostyczny. – Dmitry
Tak, użyłbym OrderRepository i UoW, aby zachować domenę jako agnostyczną trwałość, jak to możliwe, ale nic nie stoi na przeszkodzie, by kod aplikacji wywoływał Twoją usługę anulowania bez utrzymywania zmian w jednostce Order. Będąc agnostykiem, nie sądziłem, że ma to znaczenie do tej pory, że nie używamy NHibernate, więc wszelkie założenia oparte na tej ORM nie są prawidłowe. – SonOfPirate