Serwis domenowy (domain service) to biznesowa operacja, która nie wpasowuje się w odpowiedzialności Agregatów lub Value Objectów.
Wpis jest częścią serii o DDD.
Właściwości Serwisu Domenowego
Bezstanowy (stateless) – nie przechowuje żadnych danych.
Należy do warstwy domenowej – nazwy metod serwisów domenowych odzwierciedlają operacje biznesowe.
Specjalizuje się w robieniu tylko jednej rzeczy – jeden serwis domenowy jest odpowiedzialny za robienie tylko jednej rzeczy.
Może publikować zdarzenia domenowe (Domain Events) – może powiadamiać resztę systemu, że dana operacja domenowa została zakończona.
Może wchodzić w interakcje z innymi serwisami domenowymi lub repozytoriami – czyli mogą wykorzystywać inne serwisy domenowe i do pewnego stopnia repozytoria.
Przykładowe operacje Serwisu Domenowego
- Transformacja jednego obiektu domenowego w drugi
- Wyliczanie wartości na podstawie więcej niż jednego obiektu domenowego
- Sprawdzanie czy podana wartość istnieje (np. nazwa waluty, kod pocztowy miasta itp.)
Przykładowa implementacja
Poniżej przykładowa implementacja serwisu domenowego który konwertuje temperature (która w tym wypadku jest ValueObjectem) z stopni Celsjusza na Fahrenheita i w drugą stronę. Serwis ma dwie metody ale obie robią tylko jedną i tą samą rzecz – konwertuje jeden obiekt domenowy na drugi.
1
2
3
4
5
6
7
8
9
10
11
12
13
public class TemperatureConverter
{
public FahrenheitTemperature CelsiusToFahrenheit(CelsiusTemperature temperature)
{
return new FahrenheitTemperature(temperature.Value * 9 / 5 + 32);
}
public CelsiusTemperature CelsiusToFahrenheit(FahrenheitTemperature temperature)
{
return new CelsiusTemperature((temperature.Value + 32) * 5 / 9);
}
}
Oczywiście ValueObject CelsiusTemperature mógłby korzystać (lub nie) z TemperatureConverter i sam posiadać metodę ToFahrenheitTemperature, ale obiekty domenowe nie powinny posiadać wiedzy jak się konwertować w inny obiekt domenowy, to już nie jest ich odpowiedzialność tylko „czegoś” innego.
Podsumowanie
Krótko: Domain service – „Sometimes, it just isn’t thing…”
Comments powered by Disqus.