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/

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.


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


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.


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.


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?


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.