Struktura applikacji i realizacja logiki

0

Hej,
Mam pytanie o best practices. W moim restowym api mam nastepujaca strukture
RequestMapper -> Facade -> Service -> Repozitory -> Entity

Każda Encja ma stworzone odpowiadające jej DTO. Facada w zasadzie zajmuje sie głównie tłumaczeniem z DTO na Entity i otwrotnie (na razie).

Chcąc zapisac obiekt klasy A, powinien dodatkowo utworzyć się obiekt klasy B. Moje pytanie brzmi, na której warstwie powinnam realizować te logikę ?? Fasady czy Servisu ?
Service jest oznaczony jako Transactional, czy fasada też powinna ?

0

A możesz szerzej opisać problem? Na konkretnym przykładzie?
Odpowiadając generalnie - na warstwach obiektów domenowych, ale nie fasady, w twoim przypadku pewnie będzie to serwis. Możesz także tworzyć te obiekty w encjach jeżeli to co chcesz otrzymać jako obiekt B to value object.

0
hcubyc napisał(a):

A możesz szerzej opisać problem? Na konkretnym przykładzie?
Odpowiadając generalnie - na warstwach obiektów domenowych, ale nie fasady, w twoim przypadku pewnie będzie to serwis. Możesz także tworzyć te obiekty w encjach jeżeli to co chcesz otrzymać jako obiekt B to value object.

Class Member {
String name;
String surname;
}

Class Relation. {

Member Father;
Member Mother;
List<Member> Children;

Relation(Member mother, Member father, Member... child) {
}

W chwili gdy tworze member powinna sie stworzyc. takze Relation(null, null, createdMember).
W starej implementacji, logika ta byla po stornie Service bo jest transakcyjny.. wiec nawet to logiczne.. jesli pojawi sie blad przy zapisywaniu relacji to member tez powinien sie wykasowac. Fasada natomiast realizowala tlumaczenie i sprawdzala ewentualnie na wejsciu nulle. Ale nie jestem pewna czy to podejście jest prawidłowe. Czy może Fasada, która zarzadza tymi DTO powinna sobie decydowac o tym jakie obiekty tworzy i przesyłać to do serwizu, który zajmuje się jedynie wywoływaniem odpowiednich funkcji z repozytorium.

Kazde Repozytorium, ma odpowiadający mu Serwis. Natomiast Fasady mam tylko 2. Jedną dla Usera i typowo spraw zarzadzania kontem i drugą dla Projektu. I w projekcie wstrzykuje beany wszysktich potrzebnych serwisów.

Potem dochodzi temat zwracancych obiektów. Jako że dodanie jednej relacji może powodowac ze kilka trzeba będzie zmodyfikowac.. jeszcze inne usunąc itd... to zwracanym DTO będzie raczej całe Familly. Dlatego wlasnie pomysł mój był aby to fasada zarządzała, a serwisy robiły tylko to co im się kaze.

Ogólnie mam tez poboczny problem a mianowicie bledy noSession przy Fetch.LAZY czy to możliwe ze dlatego, ze wlasnie transakcja się zakonczyła gdy Service zwraca obiekty do trannsformacji w DTO na warstwie Fasade??

0

Zadam pytanie pomocnicze. Czy musisz wyciagac encje JPA z bazy danych? A moze widok albo select new ... . Wtedy od razu wyciagasz DTO. Problem solved.

0

@Vanilka: tego posta sponsorują literki CQRS oraz cyferki 349 jak JSR-349 Bean Validation

Jeżeli tworzysz, usuwasz albo modyfikujesz dane, to wysyłasz w żądaniu obiekty, które można mapować do encji 1:1. Walidacja odbywa się za pomocą odpowiednich adnotacji (w miarę proste i skuteczne choć czasem magiczne), albo za pomocą odpowiednich typów (trzeba wiedzieć jak to zrobić).

Jeżeli pobierasz dane to wykorzystujesz zapytania SELECT new ViewOfCośtam()…, które zwracają bezpośrednio DTO.

0

IMHO fasada stanowi wejście do domeny i API - przyjmuje obiekty z zewnątrz i 'zleca' obiektom domenowym/serwisom ich przetworzenie. Tak więc jeżeli masz przykład, że np dostajesz DTOsa i musisz wywołać dwa serwisy i potem jeszcze to co ci zwrócą zlepiasz w jeden obiekt - to moim zdaniem właśnie powinna realizować fasada (wywołanie serwisów, tworzenie obiektów domenowych z dtosow i na odwrót). Natomiast jeżeli np dostajesz DTOsa i z punktu widzenia domeny utworzenie obiektów, dajmy na to memberów i relacji jest ważne - to robi to serwis. Na przykładzie - jeżeli tworzysz zamówienie i zamówienie ma odpowiednie reguły, tzn. należy sprawdzić czy np. zawiera produkty dostępne na stanie magazynowym i czy konto użyktownika nie jest zablokowane - to się dzieje poniżej fasady (w serwisie czy gdziekolwiek indziej, bo to już nie jest proste utworzenie obiektu z dtosa). Natomiast jeżeli tworzysz zamówienie i masz 2 serwisy, z czego jeden najpierw tworzy zamówienie, a kolejny np zleca wysyłkę to te operacje zlecasz z fasady.

1 użytkowników online, w tym zalogowanych: 0, gości: 1