Usługi są w 3 smakach: Usługi Domain , Application Services i infrastruktury usług .
- Usługi domenowe : Hermetyzuje
logikę biznesową , która naturalnie nie mieści się w obiekcie domeny i NIE JEST typowymi operacjami CRUD - należałyby one do repozytorium .
- Usługi aplikacji : używane przez zewnętrznych konsumentów do komunikowania się z twoim systemem (pomyśl Usługi sieciowe ). Gdyby konsumenci potrzebowali dostępu do operacji CRUD, byliby tutaj narażeni.
- Usługi infrastrukturalne : Używane w celu wyjaśnienia problemów technicznych (np. MSMQ, dostawca poczty e-mail itp.).
Utrzymywanie usług domenowych wraz z obiektami domeny jest rozsądne - wszystkie skupiają się na logice domeny. I tak, możesz wstrzykiwać repozytoria do swoich usług.
Usługi aplikacji zazwyczaj będą używać zarówno usług domenowych, jak i repozytoriów do obsługi zewnętrznych żądań.
Mam nadzieję, że to pomaga!
(Jeśli nie masz ochoty czytać, na dole jest podsumowanie :-)
Ja również miałem problemy z precyzyjną definicją usług aplikacyjnych. Chociaż odpowiedź Vijay była bardzo pomocna w moim procesie myślenia miesiąc temu, nie zgadzam się z częścią tego.
Inne zasoby
Jest bardzo mało informacji o usługach aplikacyjnych. Tematy takie jak zagregowane katalogi główne, repozytoria i usługi domenowe są szeroko dyskutowane, ale usługi aplikacyjne są wspomniane tylko krótko lub całkowicie pominięte.
Artykuł w MSDN Magazine Wprowadzenie do projektowania opartego na domenie opisuje usługi aplikacji jako sposób na transformację i / lub udostępnienie modelu domeny klientom zewnętrznym, np. Jako usługa WCF. W ten sposób Vijay opisuje również usługi aplikacji. Z tego punktu widzenia usługi aplikacji są interfejsem do Twojej domeny .
Artykuły Jeffrey Palermo na temat architektury cebuli (część pierwsza , druga i trzecia ) są dobrą lekturą. Traktuje usługi aplikacji jako pojęcia na poziomie aplikacji , takie jak sesja użytkownika. Chociaż jest to bliższe mojemu zrozumieniu usług aplikacyjnych, nadal nie jest to zgodne z moimi przemyśleniami na ten temat.
Moje myśli
Zacząłem myśleć o usługach aplikacyjnych jako o zależnościach zapewnianych przez aplikację . W takim przypadku aplikacja może być aplikacją komputerową lub usługą WCF.
Domena
Czas na przykład. Zaczynasz od swojej domeny. Zaimplementowane są tutaj wszystkie podmioty i wszelkie usługi domenowe, które nie zależą od zasobów zewnętrznych. Wszelkie koncepcje domen zależne od zasobów zewnętrznych są definiowane przez interfejs. Oto możliwy układ rozwiązania (pogrubiona nazwa projektu):
Product
IProductFactory
zajęcia zostały wdrożone w zespole rdzenia. JestIProductRepository
to coś, co prawdopodobnie jest wspierane przez bazę danych. Implementacja tego nie jest domeną i dlatego jest zdefiniowana przez interfejs.Na razie skupimy się na
IExchangeRateService
. Logika biznesowa tej usługi jest realizowana przez zewnętrzną usługę internetową. Jednak jego koncepcja jest nadal częścią domeny i jest reprezentowana przez ten interfejs.Infrastruktura
Implementacja zewnętrznych zależności jest częścią infrastruktury aplikacji:
XEExchangeRateService
implementujeIExchangeRateService
usługę domenową komunikując się z xe.com . Ta implementacja może być używana przez aplikacje korzystające z modelu domeny, włączając zestaw infrastruktury.Podanie
Pamiętaj, że nie wspomniałem jeszcze o usługach aplikacyjnych. Przyjrzymy się teraz tym. Powiedzmy, że chcemy zapewnić
IExchangeRateService
implementację, która wykorzystuje pamięć podręczną do szybkiego wyszukiwania. Zarys tej klasy dekoratora może wyglądać tak.Zauważ
ICache
parametr? Ta koncepcja nie jest częścią naszej domeny, więc nie jest to usługa domenowa. To usługa aplikacji . Jest to zależność naszej infrastruktury, którą może zapewnić aplikacja. Przedstawiamy aplikację, która to pokazuje:Wszystko to łączy się w takiej aplikacji:
Podsumowanie
Kompletna aplikacja składa się z trzech głównych warstw:
Warstwa domeny zawiera jednostki domeny i autonomiczne usługi domenowe. Wszelkie koncepcje domen (w tym usługi domenowe, ale także repozytoria), które zależą od zasobów zewnętrznych, są definiowane przez interfejsy.
Warstwa infrastruktury zawiera implementację interfejsów z warstwy domeny. Implementacje te mogą wprowadzać nowe zależności niebędące domenami, które muszą być dostarczone aplikacji. Są to usługi aplikacji i są reprezentowane przez interfejsy.
Warstwa aplikacji zawiera implementację usług aplikacji. Warstwa aplikacji może również zawierać dodatkowe implementacje interfejsów domen, jeśli implementacje dostarczone przez warstwę infrastruktury nie są wystarczające.
Chociaż ta perspektywa może nie pasować do ogólnej definicji usług DDD, oddziela ona domenę od aplikacji i umożliwia współdzielenie zestawu domeny (i infrastruktury) między kilkoma aplikacjami.
źródło
IExchangeRateService
interfejs? Jest to koncepcja domeny, tj. Coś, co jest zawarte we wszechobecnym języku klienta. Inne części domeny mogą zależeć od tej usługi, dlatego jej interfejs jest zdefiniowany w warstwie domeny. Ponieważ jednak jego implementacja obejmuje zewnętrzną usługę internetową, klasa implementująca znajduje się w warstwie infrastruktury. W ten sposób warstwa domeny zajmuje się tylko logiką biznesową.ExchangeRate
instancja, która zawiera walutę bazową, walutę przeciwną i wartość kursu wymiany między tymi dwiema walutami. Te ściśle powiązane wartości reprezentują koncepcję „kursu wymiany” z domeny, więc żyją w warstwie domeny. Chociaż może wydawać się prostym DTO, w DDD nazywa się go Obiektem Wartości i może zawierać dodatkową logikę biznesową do porównywania lub przekształcania instancji.Najlepszym zasobem, który pomógł mi zrozumieć różnicę między usługą aplikacji a usługą domenową, była implementacja java przykładu ładunku Erica Evansa, znaleziona tutaj . Jeśli go nie załadujesz, możesz sprawdzić elementy wewnętrzne usługi RoutingService (usługa domenowa) oraz BookingService, CargoInspectionService (które są usługami aplikacji).
Moja chwila „aha” została wywołana przez dwie rzeczy:
Czytanie opisu Usług w powyższym linku, a dokładniej to zdanie:
Czytanie tego posta na blogu , szczególnie tej części:
źródło
Usługa domenowa jest rozszerzeniem domeny. Powinno być postrzegane tylko w kontekście domeny. To nie jest żadna akcja użytkownika, jak na przykład zamknięcie konta lub coś takiego. Usługa domeny pasuje tam, gdzie nie ma stanu. W przeciwnym razie byłby to obiekt domeny. Usługa domeny robi coś, co ma sens tylko w przypadku współpracy z innymi współpracownikami (obiektami domeny lub innymi usługami). I to sens ma odpowiedzialność innej warstwy.
Usługa aplikacji to ta warstwa, która inicjuje i nadzoruje interakcję między obiektami i usługami domeny. Przebieg jest ogólnie taki: pobierz obiekt domeny (lub obiekty) z repozytorium, wykonaj akcję i umieść go (je) z powrotem (lub nie). Może zrobić więcej - na przykład może sprawdzić, czy obiekt domeny istnieje, czy nie, i odpowiednio zgłosić wyjątki. Pozwala to użytkownikowi na interakcję z aplikacją (i prawdopodobnie stąd pochodzi jej nazwa) - poprzez manipulowanie obiektami i usługami domeny. Usługi aplikacji powinny ogólnie reprezentować wszystkie możliwe przypadki użycia. Prawdopodobnie najlepszą rzeczą, jaką możesz zrobić, zanim pomyślisz o domenie, jest stworzenie interfejsów usługi aplikacji, co da ci znacznie lepszy wgląd w to, co naprawdę chcesz zrobić. Posiadanie takiej wiedzy pozwala skupić się na domenie.
Zasadniczo repozytoria można wstrzykiwać do usług domenowych, ale jest to raczej rzadki scenariusz. Jednak to warstwa aplikacji robi to przez większość czasu.
źródło
Z Czerwonej Księgi (Implementacja projektu opartego na domenie, autorstwa Vaughna Vernona) w ten sposób rozumiem te pojęcia:
Obiekty domeny ( byty i obiekty wartości ) zawierają zachowanie wymagane przez (pod) domenę, dzięki czemu jest ona naturalna, ekspresyjna i zrozumiała.
Usługi domenowe zawierają takie zachowania, które nie mieszczą się w jednym obiekcie domeny. Na przykład, biblioteka książka użyczenia
Book
DoClient
(z odpowiednimiInventory
zmianami) może zrobić z usługi domeny.Usługi aplikacyjne obsługiwać przepływ przypadkach stosowania, w tym dodatkowych problemów potrzebnych na szczycie domeny. Często ujawnia takie metody za pośrednictwem interfejsu API do użytku przez klientów zewnętrznych. W oparciu o nasz poprzedni przykład nasza usługa aplikacji może ujawnić metodę,
LendBookToClient(Guid bookGuid, Guid clientGuid)
która:Client
.Book
.Client
iBook
), aby obsłużyć rzeczywistą logikę domeny pożyczania książki klientowi. Na przykład wyobrażam sobie, że potwierdzenie dostępności książki jest zdecydowanie częścią logiki domeny.Usługa aplikacji powinna zasadniczo mieć bardzo prosty przepływ. Złożone przepływy usług aplikacyjnych często wskazują, że logika domeny wyciekła z domeny.
Jak widać, model domeny pozostaje w ten sposób bardzo czysty i jest łatwy do zrozumienia i dyskusji z ekspertami w tej dziedzinie, ponieważ zawiera on tylko własne, rzeczywiste obawy biznesowe. Z drugiej strony przepływ aplikacji jest również znacznie łatwiejszy w zarządzaniu, ponieważ nie ma obaw związanych z domeną, staje się zwięzły i prosty.
źródło
Millett, C (2010). Profesjonalne wzorce projektowe ASP.NET. Wiley Publishing. 92
źródło
Usługi domenowe : usługa wyrażająca logikę biznesową, która nie jest częścią żadnego głównego katalogu agregującego.
Masz 2 agregaty:
Product
który zawiera nazwę i cenę.Purchase
który zawiera datę zakupu, listę produktów zamówionych wraz z ilością i ceną produktu w tym czasie oraz metodę płatności.Checkout
nie jest częścią żadnego z tych dwóch modeli i jest koncepcją w Twojej firmie.Checkout
można utworzyć jako usługę domenową, która pobiera wszystkie produkty i oblicza całkowitą cenę, płaci całkowitą kwotę, dzwoniąc do innej usługi domenowejPaymentService
z częścią implementacyjną infrastruktury i przekształcając ją wPurchase
.Usługi aplikacji : usługa, która „koordynuje” lub ćwiczy metody domenowe. Może to być tak proste, jak sam kontroler.
Jest to miejsce, w którym zwykle robisz:
Możesz tutaj dokonać weryfikacji, np. Sprawdzając, czy a
Product
jest unikalny. O ileProduct
bycie niepowtarzalnym nie jest niezmiennikiem, powinno to być częścią Usługi Domeny, którą można wywołać,UniqueProductChecker
ponieważ nie może być częściąProduct
klasy i wchodzi w interakcje z wieloma Agregatami.Oto pełny przykład projektu DDD: https://github.com/VaughnVernon/IDDD_Samples
Można znaleźć wiele przykładów usługi aplikacji i kilka usług domenowych
źródło
Pomyśl o usłudze domenowej jako obiekcie, który implementuje logikę biznesową lub logikę związaną z regułami biznesowymi na obiektach domeny, a ta logika jest trudna do dopasowania do tych samych obiektów domeny, a także nie powoduje zmiany stanu usługi domeny (usługa domeny jest obiektem bez „stan” lub lepiej bez stanu o znaczeniu biznesowym), ale ostatecznie zmień stan tylko obiektów domeny, na których działa.
Podczas gdy usługa aplikacji implementuje logikę na poziomie aplikacji jako interakcję użytkownika, sprawdzanie poprawności danych wejściowych, logikę niezwiązaną z biznesem, ale z innymi problemami: uwierzytelnianiem, bezpieczeństwem, wysyłaniem e-maili itd., Ograniczając się do korzystania z usług udostępnianych przez obiekty domeny.
Przykładem tego może być następujący scenariusz, który ma na celu jedynie wyjaśnienie celu: musimy wdrożyć bardzo małą aplikację domotyczną, która wykonuje prostą operację, tj. „Włącz światła, gdy ktoś otworzy drzwi pokoju w domu, aby wejść i wyłącz światło, gdy zamyka drzwi wychodzące z pokoju ".
Upraszczając wiele, bierzemy pod uwagę tylko 2 jednostki domeny:
Door
iLamp
każdy z nich ma 2 stany, odpowiednioopen/closed
ion/off
, i konkretne metody operowania na nich zmianami stanu.W tym przypadku potrzebujemy usługi domenowej, która wykonuje konkretną operację włączania światła, gdy ktoś otwiera drzwi z zewnątrz, aby wejść do pokoju, ponieważ drzwi i obiekty lampy nie mogą zastosować tej logiki w sposób, który uważamy za odpowiedni do ich natury .
Możemy nazwać nasze usługi domeny jak
DomoticDomainService
i wdrożyć 2 sposoby:OpenTheDoorAndTurnOnTheLight
aCloseTheDoorAndTurnOffTheLight
te 2 metody respectevely zmienić stan obu obiektówDoor
iLamp
doopen/on
aclosed/off
.Stan wejścia lub wyjścia z pokoju, którego nie ma w obiekcie usługi domeny ani w obiektach domeny, ale zostanie zaimplementowany jako prosta interakcja użytkownika przez usługę aplikacji, którą możemy wywołać
HouseService
, która implementuje niektóre programy obsługi zdarzeń jakoonOpenRoom1DoorToEnter
ionCloseRoom1DoorToExit
tak dalej dla każdego pokoju (jest to tylko przykład wyjaśnienia celu ..) , które będą odpowiednio dotyczyły metod usług domenowych wywołań w celu wykonania obserwowanego zachowania (nie wzięliśmy pod uwagę jednostki,Room
ponieważ jest to tylko przykład) .Ten przykład, jak na razie będący dobrze zaprojektowaną aplikacją w świecie rzeczywistym, ma jedyny cel (jak powiedziano więcej), aby wyjaśnić, czym jest Usługa Domeny i czym różni się od Usługi Aplikacji, mam nadzieję, że będzie ona jasna i użyteczna.
źródło