Domain Driven Design: Usługa Domeny, Usługa Aplikacji
Czy ktoś może wyjaśnić różnicę między domeną a usługami aplikacyjnymi podając kilka przykładów? A jeśli usługa jest usługą domenową, czy umieszczę rzeczywistą implementację tej usługi w zestawie domenowym, a jeśli tak, czy również wstrzyknę repozytoria do tej usługi domenowej? Niektóre informacje byłyby bardzo pomocne.
6 answers
Usługi występują w 3 smakach: Usługi domenowe, usługi aplikacyjne i usługi infrastrukturalne
- Domain Services : Encapsulates logika biznesowa to nie naturalnie należy do obiektu domain i są to , A NIE Typowe operacje CRUD - należą one do repozytorium .
- Application Services : używane przez konsumenci zewnętrzni, aby porozmawiać z Twoim system (think Web Services ). Jeśli konsumenci potrzebują dostępu do operacji CRUD, byliby tu narażeni.
- usługi infrastrukturalne : używane do abstrakcyjne zagadnienia techniczne (np. MSMQ, dostawca poczty e-mail itp.) [18]}
Utrzymywanie usług domeny wraz z obiektami domeny jest rozsądne - wszystkie koncentrują się na logice domeny. I tak, możesz wprowadzić repozytoria do swoich usług.
Usługi aplikacyjne zazwyczaj używają zarówno repozytoriów domen , jak i do obsługi zewnętrznych prośby.
Mam nadzieję, że to pomoże!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-19 20:12:16
(Jeśli nie masz ochoty czytać, na dole jest podsumowanie :-)
Ja również zmagałem się z precyzyjną definicją usług aplikacyjnych. Chociaż odpowiedź Vijaya była bardzo pomocna w moim procesie myślenia miesiąc temu, doszedłem do wniosku, że nie zgadzam się z częścią tego.
Inne zasoby
Jest bardzo mało informacji o usługach aplikacyjnych. Tematy takie jak zagregowane korzenie, repozytoria i usługi domenowe są szeroko omawiane, ale usługi aplikacyjne są wymienione tylko krótko lub całkowicie pominięte.
W artykule MSDN Magazine An Introduction To Domain-Driven Design opisano usługi aplikacji jako sposób na przekształcenie i/lub udostępnienie modelu domeny zewnętrznym klientom, np. jako usługi WCF. Tak też Vijay opisuje usługi aplikacyjne. Z tego punktu widzenia usługi aplikacji są interfejsem do Twojej domeny.Artykuły Jeffreya Palermo o cebuli Architektura (część one, dwa i trzy) to dobra lektura. Usługi aplikacji traktuje jako koncepcje na poziomie aplikacji , takie jak sesja użytkownika. Chociaż jest to bliższe mojemu rozumieniu 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 dostarczanych przez aplikację. W takim przypadku aplikacja może być aplikacja desktopowa lub usługa 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 pojęcia domeny, które zależą od zasobów zewnętrznych, są definiowane przez interfejs. Oto możliwy układ rozwiązania (Nazwa projektu pogrubiona):
My Solution - My.Product.Core (My.Product.dll) - DomainServices IExchangeRateService Product ProductFactory IProductRepository
Klasy Product
i ProductFactory
zostały zaimplementowane w Core assembly. {[7] } jest czymś, co prawdopodobnie wspierane przez bazę danych. Implementacja tego nie jest problemem domeny i dlatego jest definiowana przez interfejs.
Na razie skupimy się na IExchangeRateService
. Logika biznesowa tej usługi jest implementowana przez zewnętrzny serwis internetowy. 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:
My Solution + My.Product.Core (My.Product.dll) - My.Product.Infrastructure (My.Product.Infrastructure.dll) - DomainServices XEExchangeRateService SqlServerProductRepository
XEExchangeRateService
implementuje usługę domeny {[8] } komunikując się z xe.com . Ta implementacja może być używana przez twoje aplikacje, które wykorzystują twój model domeny, włączając w to zespół infrastruktury.
Zastosowanie
Zauważ, że nie wspomniałem jeszcze o usługach aplikacji. Przyjrzymy się im teraz. Załóżmy, że chcemy dostarczyć implementację IExchangeRateService
, która używa pamięci podręcznej do szybkiego wyszukiwania. Zarys tej klasy dekoratorów może wyglądać następująco to.
public class CachingExchangeRateService : IExchangeRateService
{
private IExchangeRateService service;
private ICache cache;
public CachingExchangeRateService(IExchangeRateService service, ICache cache)
{
this.service = service;
this.cache = cache;
}
// Implementation that utilizes the provided service and cache.
}
Zauważ parametr ICache
? Ta koncepcja nie jest częścią naszej domeny, więc nie jest usługą domenową. Jest to usługa aplikacji . Jest to zależność naszej infrastruktury, którą może zapewnić aplikacja. Przedstawmy aplikację, która to demonstruje:
My Solution - My.Product.Core (My.Product.dll) - DomainServices IExchangeRateService Product ProductFactory IProductRepository - My.Product.Infrastructure (My.Product.Infrastructure.dll) - ApplicationServices ICache - DomainServices CachingExchangeRateService XEExchangeRateService SqlServerProductRepository - My.Product.WcfService (My.Product.WcfService.dll) - ApplicationServices MemcachedCache IMyWcfService.cs + MyWcfService.svc + Web.config
To wszystko łączy się w aplikacji Tak:
// Set up all the dependencies and register them in the IoC container.
var service = new XEExchangeRateService();
var cache = new MemcachedCache();
var cachingService = new CachingExchangeRateService(service, cache);
ServiceLocator.For<IExchangeRateService>().Use(cachingService);
Podsumowanie
Kompletny wniosek składa się z trzech głównych warstwy:
- domena
- Infrastruktura
- zastosowanie
Warstwa domeny zawiera encje domen i autonomiczne Usługi domenowe. Wszelkie pojęcia domeny (obejmuje to usługi domeny, 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. Wdrożenia te mogą wprowadzić nowe Nie-domeny zależności, 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 domenowych, jeśli implementacje dostarczane przez warstwę infrastruktury nie są wystarczające.
Chociaż ta perspektywa może nie pasować do ogólnej definicji DDD usługi, oddziela domenę od aplikacji i pozwala na współdzielenie domeny (i infrastruktury) pomiędzy kilkoma aplikacjami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 21:53:17
Najlepszym zasobem, który pomógł mi zrozumieć różnicę między usługą aplikacyjną a usługą domenową, była implementacja Javy z przykładu ładunku Erica Evansa, znalezionego tutaj . Jeśli go nie pobierzesz, możesz sprawdzić wewnętrzne usługi RoutingService (usługa domeny) i BookingService, CargoInspectionService (które są usługami aplikacji).
Mój moment 'aha' został wywołany przez dwie rzeczy:
- Czytanie opisu usług w linku powyżej, dokładniej to zdanie:
Usługi domenowe są wyrażone w kategoriach wszechobecnego języka i typy domen, tzn. argumenty metody i wartości zwracane są odpowiednie klasy domen.
- czytanie tego posta na blogu , szczególnie tej części:
To, co znajduję dużą pomoc w oddzielaniu jabłek od pomarańczy, to myślenie w kategoriach przepływu pracy aplikacji. Cała logika dotycząca przepływ pracy aplikacji zazwyczaj kończy się jako usługi aplikacji uwzględnione w warstwie aplikacji, natomiast koncepcje z dziedziny które wydają się nie pasować, ponieważ obiekty modelowe tworzą jeden lub więcej Usługi Domenowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-12 10:50:03
Usługa domeny jest rozszerzeniem domeny. Powinno być postrzegane tylko w kontekście danej domeny. To nie jest jakaś akcja użytkownika jak na przykład close account czy 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 wtedy, gdy jest wykonywana z innymi współpracownikami (obiekty domeny lub inne usługi). A to, że [[3]}ma sens jest odpowiedzialnością innego warstwa.
Usługa Aplikacji jest warstwą inicjującą i nadzorującą interakcję między obiektami domeny i usługami. Przepływ jest zazwyczaj taki: pobrać obiekt domeny (lub obiekty) z repozytorium, wykonać akcję i umieścić ją (je) tam (lub nie). Może zrobić więcej - na przykład może sprawdzić, czy obiekt domeny istnieje, czy nie i odpowiednio rzucać wyjątki. Pozwala więc użytkownikowi na interakcję z aplikacją (i prawdopodobnie stąd pochodzi jej nazwa from) - poprzez manipulowanie obiektami i usługami domeny. Usługi aplikacyjne powinny zasadniczo reprezentować wszystkie możliwe przypadki użycia . Prawdopodobnie najlepszą rzeczą, jaką możesz zrobić, zanim pomyślisz o domenie, jest stworzenie interfejsów usług aplikacji, co da ci znacznie lepszy wgląd w to, co naprawdę próbujesz zrobić. Posiadanie takiej wiedzy pozwala skupić się na domenie.
Repozytoria mogą być ogólnie rzecz biorąc wstrzykiwane do usług domenowych, ale jest to raczej rzadki scenariusz. Informatyka jest warstwą aplikacji, która robi to przez większość czasu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 12:32:34
Z Czerwonej Księgi (Implementing Domain Driven Design, autorstwa Vaughna Vernona), Tak rozumiem pojęcia:
Obiekty domeny (encje i obiekty wartości ) hermetyzują zachowanie wymagane przez (Pod)domenę, czyniąc ją naturalną, wyrazistą i zrozumiałą.
Usługi domeny zawierają takie zachowania, które nie mieszczą się w obiekcie domeny . Na przykład biblioteka książek użyczająca Book
Client
(z odpowiednie zmiany Inventory
) mogą to zrobić z usługi domeny.
Usługi aplikacyjne obsługują przepływ przypadków użycia, w tym wszelkie dodatkowe obawy potrzebne na szczycie domeny. często ujawnia takie metody za pośrednictwem swojego API, do wykorzystania przez klientów zewnętrznych. Aby bazować na naszym poprzednim przykładzie, nasza usługa aplikacji może ujawnić metodę LendBookToClient(Guid bookGuid, Guid clientGuid)
, która:
- odzyskuje
Client
. - potwierdza jego uprawnienia. (zauważ jak zachowaliśmy nasz model domeny bez obaw o bezpieczeństwo / zarządzanie użytkownikami. Takie zanieczyszczenie może prowadzić do wielu problemów. Zamiast tego spełniamy ten wymóg techniczny tutaj, w naszym serwisie aplikacji.)
- odzyskuje
Book
.
Domena ta jest używana do obsługi domen (przekazujących
Client
i Book
), Aby Obsługiwać rzeczywistą logikę domeny wypożyczenia książki klientowi. Na przykład, wyobrażam sobie, że potwierdzenie dostępności książki jest zdecydowanie częścią domeny logika.
Usługa aplikacji powinna mieć bardzo prosty przepływ. Złożone przepływy usług aplikacji często wskazują, że logika domeny wyciekła z domeny.
Jak mamy nadzieję zobaczyć, model domeny pozostaje bardzoczysty w ten sposób i jest łatwy do zrozumienia i omówienia z ekspertami od domen, ponieważ zawiera tylko własne, rzeczywiste problemy biznesowe. przepływ aplikacji , z drugiej strony, jest również dużo łatwiejszy w zarządzaniu, ponieważ jest zwolniony z obaw dotyczących domeny i staje się zwięzły i prosty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 16:21:01
Domain Services: metody, które tak naprawdę nie pasują do jednego podmiotu lub wymagają dostępu do repozytorium są zawarte w domenie usługi. Warstwa usługi domeny może również zawierać logikę domeny własnej i jest tak samo częścią modelu domeny jak podmioty i wartość obiektów.
Usługi aplikacji: usługa Aplikacji jest cienką warstwą, która znajduje się nad modelem domeny i koordynuje aplikację aktywność. Nie zawiera logiki biznesowej i nie posiada stan wszelkich podmiotów; może jednak przechowywać stan przedsiębiorstwa transakcja workflow. Korzystasz z usługi aplikacji w celu zapewnienia interfejsu API do modelu domeny za pomocą wzorca wiadomości Request-Reply.
Millett, C (2010). Professional ASP.NET wzorce projektowe. Wydawnictwo Wiley. 92.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-17 10:35:10