(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):
Moje rozwiązanie
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Produkt
ProductFactory
IProductRepository
Product
I ProductFactory
zajęcia zostały wdrożone w zespole rdzenia. Jest IProductRepository
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:
Moje rozwiązanie
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- DomainServices
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
implementuje IExchangeRateService
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.
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ż 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:
Moje rozwiązanie
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
Produkt
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
Wszystko to łączy się w takiej aplikacji:
// 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
Kompletna aplikacja składa się z trzech głównych warstw:
- domena
- infrastruktura
- podanie
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.