Warstwa serwisowa a DAO - dlaczego oba?

64

Pracowałem z SpringMVC, Hibernate i niektórymi bazami danych na przykładzie aplikacji internetowej Java.

Jest kilka różnych, które to robią, ale ten samouczek integracji Spring 3 i hibernacji z przykładem ma klasę modelu, widok (w jsp) oraz klasy usługi i dao dla kontrolera.

Moje pytanie brzmi: czy zarówno usługa, jak i klasy DAO nie robią tego samego? Dlaczego miałbyś ich potrzebować?

To był samouczek, którego faktycznie używałem : http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Jeff
źródło

Odpowiedzi:

60

Zasadniczo DAO jest tak lekki, jak to możliwe i istnieje wyłącznie w celu zapewnienia połączenia z bazą danych, czasami jest abstrakcyjny, aby można było użyć różnych backendów bazy danych.

Warstwa usług ma zapewniać logikę działania na danych wysyłanych do i od DAO i klienta. Bardzo często te 2 elementy zostaną zebrane razem w ten sam moduł, a czasami w ten sam kod, ale nadal będą postrzegane jako odrębne logiczne jednostki.

Innym powodem jest bezpieczeństwo - jeśli udostępniasz warstwę usługi, która nie ma związku z bazą danych, trudniej jest uzyskać dostęp do bazy danych od klienta, chyba że za pośrednictwem usługi. Jeśli dostęp do bazy danych nie jest możliwy bezpośrednio z klienta (i nie ma trywialnego modułu DAO działającego jako usługa), wówczas atakujący, który przejął klienta, może próbować zhakować warstwę usługi, zanim uzyska wszystko oprócz najbardziej oczyszczony dostęp do twoich danych.

gbjbaanb
źródło
1
Zgadzam się z rozdzieleniem warstw usługi i dao oraz warstwy usługi zawierającej logikę biznesową.
Peter Delaney,
nie wspominając już o tym, że 1 usługa może wywoływać kilka DAO, na przykład podczas zapisywania użytkownika możesz porozmawiać z Userexe, UserOrdersexe itp. Czy powinniśmy utworzyć jedną usługę dla każdego? A kto mógłby zadzwonić do wszystkich tych usług?
Fermin Silva
40

Jestem pisarzem danego postu. Mam swój uczciwy udział w pracy nad różnymi technologiami i różnymi architekturami. Na podstawie powyższego mogę śmiało powiedzieć, że posiadanie warstwy usługi i warstwy dao jest zawsze dobrym pomysłem. DAO powinno być ograniczone do dodawania / aktualizacji / wstawiania / wybierania obiektów encji do / z bazy danych i to wszystko. Jeśli chcesz zrobić coś więcej pod względem logiki, dodaj to do warstwy usługi. Pomoże to uczynić kod modularnym i łatwym do zastąpienia po wymianie bazy danych (dla pewnej części danych). Ma to szczególne zastosowanie w aplikacjach zawierających raporty, które mają ciężką logikę nawet po pobraniu danych z bazy danych.

Również wiosną bezpieczeństwo jest idealnie stosowane w warstwie serwisowej. Nie chciałbyś tego zmienić.

lokesh
źródło
5
Hej, wielkie dzięki za odpowiedź na moje pytanie; to poświęcenie dla twojego bloga! Dzięki za wspaniały przykład, pisz dalej.
Jeff
To denerwowało mnie przez pewien czas i myślę, że doświadczenie pomaga najbardziej w takich sytuacjach. Dziękuję Ci.
Utku Özdemir
Zgadzam się z rozdzieleniem warstw usługi i dao oraz warstwy usługi zawierającej logikę biznesową i nazwałbym tylko metody Dao. A co, gdy jedna z moich metod usługi musi wywołać inną metodę usługi. Czy powinienem mieć inną abstrakcję ponad warstwą usługi, która wywołuje wiele metod usługi?
Peter Delaney,
Nie. Klasy w warstwie usług mogą się do siebie odnosić (w razie potrzeby) i wywoływać wymagane metody.
lokesh
11

Adam Bien podkreśla w swojej książce, że JPA EntityManager jest dobrą uniwersalną implementacją DAO:

http://realworldpatterns.com/

W świecie Java EE prawie nigdy nie ma potrzeby pisania własnego DAO, ponieważ zawiera on implementacje JPA. Musisz tylko napisać warstwę usługi.

Wdrożenie własnej warstwy DAO jest naprawdę kacem z bardzo słabej architektury J2EE sprzed 15 lat, ale wiele osób nadal czuje się do tego zmuszonych. Te niestandardowe warstwy DAO często zapewniają jedynie funkcje przekazywania, które wywołują odpowiednią metodę w EntityManager.

Aby odpowiedzieć na twoje pytanie, tak, potrzebujesz warstwy usługi i DAO, ale musisz tylko napisać warstwę usługi.

Dean Schulze
źródło
2
Nie jestem pewien, czy dotyczy to wiosny - zawsze istnieje niestandardowe DAO, które należy wykonać dla modelu. Może twoje stwierdzenie „prawie nigdy nie ma potrzeby pisać własnego DAO” dotyczy konkretnie kontenerów / serwera aplikacji EJB?
Don Cheadle
1
Lepiej jest napisać własną (DAO / DAOImpl), chociaż będzie ona mapowana tylko do EntityManager - to dlatego, że w przyszłości można dodać kolejną implementację DAO bez konieczności zmiany kodu warstwy usługi .
ahmednabil88
@YajliMaclo jaka jest różnica, co zmienić?
Alex78191
4

Zazwyczaj umieszczam cały kod specyficzny dla bazy danych (zapytania) w DAO oraz obsługę transakcji i logikę biznesową w usługach. Pozwala to metodom serwisowym wywoływać metody na wielu serwerach dao i zachować je w ramach tej samej transakcji. Moim zdaniem pozwala to na lepsze wykorzystanie kodu w dao.

sbrattla
źródło
2

Przekonałem się, że warstwa usługi w większości przypadków powoduje niepotrzebną złożoność. Teoretycznie należy unikać logiki biznesowej w warstwie dao, ale ostatecznie prowadzi to do zamieszania, nawet niektórzy ludzie nie chcieli całkowicie usunąć warstwy dao, ponieważ uważają, że nie wnosi ona wartości dodanej. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Ale jeśli masz wiele logiki biznesowej, to tak. To dobry pomysł. Jak ważne jest stworzenie warstwy usługi?

Jezus
źródło
3
Czytałem wielokrotnie wpis Ayende na blogu i po prostu nie mogę się oprzeć wrażeniu, że jego projekt (z którym zgodziłbym się w pewnym momencie), choć zgodny z duchem YAGNI, prawie nieuchronnie kosztowałby więcej czasu twórczego nawet w średnioterminowo, niż byłoby początkowo kosztować utworzenie abstrakcji warstw. Zastanawiam się, czy zmienił zdanie na temat ścisłego powiązania między całą aplikacją a NHibernate teraz, gdy jeszcze bardziej powszechne jest, że jedna aplikacja pyta o wiele źródeł danych SQL, NoSQL i API.
Pan Cochese,
@LennyGodber tak, wiem, że twoje odczucia IMO lepiej jest mieć warstwę DAO / repozytorium, ponieważ ma więcej zalet i wad, ponieważ, jak mówiłeś, bardzo często jest mieć wiele źródeł danych
Jesus
-1

IMHO warstwę usługową można uznać za warstwę między kontrolerem a warstwą DAO. Ta warstwa usługi jest dokładnie tam, gdzie możemy dodać logikę biznesową, a nawet stworzyć obiekt zwrotny specyficzny dla tego, co ma być renderowane przez widok.

compserve23
źródło