2015-12-04 3 views

Odpowiedz

30

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.

+1

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. –