DDD: Gdzie umieścić procedury obsługi zdarzeń domeny?

13

Czy możesz mi powiedzieć, że która warstwa jest odpowiednia do umieszczenia modułów obsługi zdarzeń domeny w DDD? Na przykład mam usługę aplikacji, aby dodać nową umowę i chciałbym wysłać powiadomienie e-mail do osoby kontaktowej, gdy umowa zostanie dodana, podobnie jak ta usługa nadawcy wiadomości e-mail (która obsługuje zdarzenie ContractAdded) lub usługa domeny lub coś innego?

Toni
źródło

Odpowiedzi:

12

Umieszczam moduły obsługi zdarzeń domeny w warstwie aplikacji.

Wydarzenie domenowe to sposób na poinformowanie zewnętrznych warstw (lub świata zewnętrznego), że coś się wydarzyło w warstwie domenowej. Co zrobić ze zdarzeniem, zależy od aplikacji. Aplikacja może powiadomić użytkownika o zmianach lub może zadzwonić do innej domeny, aby coś zrobić. Aplikacja jest odpowiedzialna za koordynowanie operacji domeny w reakcji na działania użytkownika, żądania sieciowe lub zdarzenia domeny.

Eugene Khudoy
źródło
1
+1 dla warstwy aplikacji. W projekcie pod pubu zdarzenie domeny może aktywować logikę ogólną w różnych miejscach / systemach / mikrousługach. Jeśli jeden z subskrybentów jest aplikacją modelowaną za pomocą DDD, zdarzenie wyzwala pewne przetwarzanie w tej aplikacji / BC. Przetwarzanie to może wymagać rozgraniczenia transakcji, kontroli dostępu, koordynacji, która zazwyczaj jest wykonywana w warstwie aplikacji.
Paulo Merson
2

Oryginalna książka DDD (Evans 2004) wyjaśnia warstwę aplikacji jako cienką warstwę, która wykonuje obiekty domeny w odpowiedzi na działanie użytkownika. Typowe programy obsługi zdarzeń dla zdarzeń domenowych nie należą zatem do warstwy aplikacji.

Umieszczenie niektórych z nich w warstwie domeny może mieć sens, o ile nie zerwiesz warstw, tworząc zależność w górę.

Jeśli masz warstwę infrastruktury znajdującą się poniżej warstwy domeny, moduł obsługi zdarzeń nie może tam być, ponieważ spowodowałby przerwanie warstw.

Jeśli masz warstwę adapterów znajdującą się powyżej warstwy domeny, możesz utworzyć tam moduł obsługi zdarzeń. Sprawdź sześciokątną architekturę .

Gudmundur Orn
źródło
2

Umieszczam moduły obsługi zdarzeń domeny w warstwie domeny jako interfejs domeny IDomainEventHandler.

Przykładem procedury obsługi zdarzeń domeny jest zasada, która subskrybuje określone zdarzenie domeny w celu zainicjowania nowej transakcji (np. W celu wyzwolenia nowego polecenia domeny), dlatego sensowne jest mieć ją w warstwie domeny, ponieważ jest ona powiązana z logika biznesowa.

Możemy pomyśleć o przykładzie, w którym zamówienie jest potwierdzone i dlatego należy utworzyć żądanie faktury. Mamy wydarzenie, OrderConfirmedEventktóre się wydarzyło. Zasady w naszej domenie byłyby odpowiedzialne za subskrybowanie tego zdarzenia i utworzenie polecenia domeny, RequestInvoicektóre będzie obsługiwane przez moduł obsługi poleceń i odpowiednio przez nie obsługiwane.

Gdybyśmy mieli ten moduł obsługi zdarzeń w warstwie aplikacji, oznaczałoby to, że warstwa aplikacji, oprócz koordynowania działań użytkownika, wykonywałaby logikę biznesową, co wydaje się niepoprawne.

Jednak my mamy

diegosasw
źródło