Po komentarzu tego question. Zacząłem badania, ale nadal jestem zdezorientowany.
Podmioty powinny przekonwertować na Dto przed powrotem do kontrolera? Dla mnie nie brzmi to zbyt praktycznie.Podmioty wiosenne powinny przekonwertować na Dto w usłudze?
Odpowiedz
Mówimy o architekturze oprogramowania i jak zawsze, gdy mówimy o architekturze oprogramowania, istnieje tysiąc sposobów na zrobienie czegoś i wiele opinii na temat tego, co jest najlepsze. Ale nie ma najlepszej drogi, wszystko ma swoje zalety i wady. Pamiętaj o tym!
Zazwyczaj masz różne warstwy:
- Warstwa wytrwałość do przechowywania danych
- warstwy biznesowej do pracy na danych
- Warstwa prezentacji narażać dane
Zazwyczaj każda warstwa używałby własnego rodzaju obiektów:
- Trwałość warstwy: Repozytoria podmioty
- firm warstwy: Usługi, Domena Przedmioty
- Prezentacja warstwy: Kontrolery, DTOs
Oznacza to, że każda warstwa będzie działać tylko z własnymi obiektami i nigdy przekazać je do kolejna warstwa.
Dlaczego? Ponieważ chcesz, aby każda warstwa była oddzielona od innych warstw. Jeśli chcesz użyć elementów w kontrolerze, prezentacja będzie zależała od sposobu przechowywania danych. To naprawdę źle. Twój widok nie ma nic wspólnego z przechowywaniem danych. Nie powinien nawet wiedzieć, ani jak przechowywane są dane.
Pomyśl o tym: Zmieniasz model bazy danych, np. dodajesz nową kolumnę do jednej z tabel bazy danych. Jeśli przekażesz te jednostki do kontrolera (lub gorzej: kontroler ujawni je jako JSON), zmiana w bazie danych spowoduje zmianę w prezentacji. Jeśli jednostki są bezpośrednio ujawnione jako JSON, może to nawet spowodować zmiany w JavaScript lub niektórych innych klientach korzystających z JSON. Tak więc prosta zmiana w bazie danych może wymagać zmiany w interfejsie JavaScript, ponieważ pary są bardzo ciasne. Na pewno nie chcesz tego w prawdziwym projekcie.
Jak? masz wątpliwości, że to jest możliwe, więc po prostu mały przykład tego, jak to zrobić w (pseudo) Kod:
class Repository {
public Person loadById(Long id) {
PersonEntity entity = loadEntityById(id);
Person person = new Person();
person.setId(entity.getId());
person.setName(entity.getFirstName + " " + entity.getLastName());
return person;
}
}
W tym przykładzie repozytorium użyłby wewnętrznie podmiotów. Żadna inna warstwa nie zna ani nie używa tych elementów! Są szczegółami implementacji tej konkretnej warstwy. Jeśli więc repozytorium zostanie poproszone o zwrócenie "osoby", działa ona na encji, ale zwróci obiekt domeny. Tak więc warstwa domeny, która działa z repozytorium, jest zapisana w przypadku, gdy jednostki muszą zostać zmienione. I jak widać w przypadku nazwy, domena i baza danych mogą być inne. Baza danych przechowuje nazwę w imie i nazwisko, ale tylko jedna nazwa. Jest to szczegół trwałości, w jaki sposób przechowuje nazwę.
To samo dotyczy kontrolerów i DTO, tylko kolejna warstwa.
Dziękuję za bardzo jasne wyjaśnienie. Rozważę ** zalety i wady ** tutaj dla następnego projektu. W moim obecnym projekcie nie potrzebuję takiego oddzielenia, które w warstwie Persistence. Obecnie konwertuję jednostki w moich kontrolerach, wydaje się, że przenoszę zły krok, lepiej zrobię to na klasach usług. –