Dla uproszczenia załóżmy, że hurr durr biznis aplikejszyn
ma 3 główne warstwy (choć oczywiście veri sirius biznis enterprajs aplikejszyn
może mieć ich dużo więcej):
- Kontrolery - czyli interfejs, przez który świat zewnętrzny może komunikować się z aplikacją
- Serwisy - w dużym skrócie odpowiadają za "wysokopoziomowe" operacje, których wykonanie chciałby zlecić ktoś ze świata zewnętrznego
- Repozytoria / DAO - czyli źródła danych dla warstwy logicznej, na których serwisy wykonują operacje by zrealizować swoją logikę. Wykonują niskopoziomowe operacje, o których świat zewnętrzy nie chce wiedzieć.
Świat zewnętrzny interesuje tylko wysokopoziomowy aspekt Twojej aplikacji, klient żąda wykonania konkretnej operacji czy zwrócenia konkretnego wyniku. Encje pasują do opisywania rzeczywistości w ten sposób jak pięść do nosa. Gdy pytasz kogoś, czy zna Jadzię Kowalską i mógłby Ci dać jakiś kontakt do niej, chcesz dostać:
- jej numer telefonu
- jej adres email
- być może jej adres kontaktowy
- być może jakiś link do social media
A nie:
- informację, czy ją jest córką, żoną, matką i kuzynką
- pojemność silnika jej samochodu
- datę chrztu
- co ma w lodówce
Dlatego tłumaczysz encje do DTO, w którym przekazujesz tylko te informacje, które są istotne w danym kontekście ;)
Jak już @Shalom i ktośtam jeszcze wspomniał, generalnie o te konwersje DTO <-> encja można się pokusić w dwóch miejscach:
- na wejściu i wyjściu z metod serwisu
- w kontrolerze, przez owrapowanie wywołania serwisu w te konwersje
Przy czym osobiście wolę już robić to w serwisie - jak wpakujesz te konwersje do kontrolera, to zaraz ktoś mądry przytroczy tam również część logiki, bo przecież i tak coś tam się już dzieje
, no to jaki jest sens zmieniać w serwisie coś, co ma się dziać tylko przy wywołaniu danego endpointu etc. etc.... No ogólnie mam wrażenie, że z tym podejściem pokusa, by nababrać sobie w kodzie jest większa :D
W sumie w obecnym projekcie posunęliśmy się do tego, że samą translację DTO <-> encje przenieśliśmy poza właściwe serwisy, które tylko do niej sięgają i dostają gotowe obiekty, bez mieszania logiki aplikacji z translacją. Czy to dobre rozwiązanie? Nie wiem, pewnie nie, czas pokaże - choć póki co jakoś się jeszcze broni.