Buduję aplikację internetową, która przede wszystkim stanowi operację CRUD danych z zaplecza/bazy danych. Są przypadki, w których muszę napisać logikę biznesową (jestem pewien, że będziemy mieli więcej logiki biznesowej, kiedy będziemy się zagłębiać w rozwój). Aktualnie dla każdego tworzonego przeze mnie ekranu UI tworzę klasę modelu, klasę usługi, klasę DAO, kontroler (to w zasadzie serwlet) i mnóstwo stron jsp. W większości przypadków klasa usługi po prostu wywołuje metody z DAO, aby przekazać obiekty modelu. Zasadniczo używamy klas modeli do mapowania danych z ekranów interfejsu użytkownika. W związku z tym kontroler będzie zawierał obiekty modelu po przesłaniu formularza. Zacząłem używać klas usług, aby zachować warstwę separacji od warstwy internetowej do warstwy DAO. Czasem jednak wydaje mi się, że klasa serwisowa po prostu dodaje niepotrzebny poziom wywołań interfejsu API. Sądzę, że mógłbym wprowadzić DAO do kontrolera i wykonać to zadanie szybciej. Chcę korzystać z klasy usługi tylko wtedy, gdy jest wykonywana dodatkowa logika biznesowa. Jeśli musisz zaprojektować aplikację, jakie czynniki bierzesz pod uwagę przy korzystaniu z kontrolera-> DAO względem kontrolera-> Service-> DAO control flow?Korzystanie z usług i DAO w kontrolerach mvc na wiosnę
Odpowiedz
DAO są bardziej szczegółowe i dotyczą jednej konkretnej jednostki. Usługi zapewniają funkcjonalność na poziomie makro i mogą skończyć z wykorzystaniem więcej niż jednego DAO. Zazwyczaj Usługi służą do definiowania granic transakcji w celu uzyskania atomowości. Innymi słowy, jeśli kończy się aktualizowanie wielu tabel przy użyciu wielu obiektów DAO, zdefiniowanie granicy transakcji w usłudze może pomóc w zatwierdzeniu lub wycofaniu wszystkich zmian wprowadzonych do bazy danych.
W swoim projekcie, ponieważ głównie robisz CRUD dla różnych podmiotów, może się wydawać, że usługi nie dodają dużo wartości. Jednak pomyśl o interfejsie internetowym jako sposobie aktualizacji danych. Korzystanie z usług pozwoli na udostępnienie tych samych funkcji, co usługa internetowa, później innym formom klientów, takim jak integratorzy zewnętrzni, itp.
Podsumowując, Twój projekt wydaje się być zgodny z konwencjonalnymi praktykami. Jeśli uważasz, że możesz łączyć wiele usług w jeden na podstawie jakiegoś wspólnego tematu, tak aby zredukować narzut kodu, to powinieneś to zrobić. Ostatecznym celem jest stworzenie możliwego do utrzymania kodu, którego nikt nie boi się zmieniać w razie potrzeby.
"Korzystanie z usług", nie potrzebujesz klasy usług, aby zwrócić prostą listę/wykonać crud lub wystawić jako restu-api. Podczas manipulowania wieloma interaktywnymi obiektami potrzebujesz klas usługowych. – NimChimpsky
Będziesz potrzebować usług, jeśli będziesz świadczyć także aplikacje zewnętrzne. Wyobraź sobie, że masz usługę internetową zapewniającą dane dla aplikacji na Androida. Można utworzyć warstwę Service, która otrzyma dane i zwróci DTO (obiekty przesyłania danych) dla warstwy Adapter, która obsługuje żądania REST i przekształca te DTO w JSON lub XML, aby wysłać je do aplikacji Android. – dgimenes
będę odwoływać się moja odpowiedź here
Długie i krótkie jest to zaletą korzystania z usługi warstwy jest to daje swobodę poruszania się w przyszłości, jeśli chcesz zrobić coś z wiosny Bezpieczeństwa i ról itp. Pozwala to na obsługę transakcji bardziej atomowo, a sama Wiosna ma naprawdę dobre adnotacje.
Następnie musisz przejść przez bóle odrywania swoich wątpliwości DAO od kontrolerów. Jeśli masz kontrolerów silnie powiązanych z twoimi DAO, będzie to więcej pracy w przyszłości, jeśli jeszcze nie zbudowałeś warstwy usług. – david99world
Ponieważ usługa powinna zapewniać oddzielenie problemów http://en.wikipedia.org/wiki/Separation_of_concerns. Nielegalną praktyką byłoby zignorowanie tej fasady usługowej i przejście bezpośrednio do DAO od kontrolera, jeśli wprowadzono warstwę usług. Chociaż początkowo złamałbyś zasadę DRY, ponieważ początkowo nie potrzebowałbyś warstwy usługowej, fakt, że SoC byłby w przyszłości większym przykrością dla jakiegokolwiek refaktoryzacji. – david99world
Zostawię to tutaj: http://stackoverflow.com/questions/3688664/simple-spring-app-why-use-service-layer#answer-3688779, ponieważ zasadniczo podsumowuje moje uzasadnienie, dlaczego warstwa usług dla aplikacji, która może rosnąć w złożoności, jest dobrym pomysłem. – david99world
Skorzystaj z klasy usługowej, gdy masz do czynienia z więcej niż jednym aggregate root.
Wstrzykiwanie repozytoriów (zwane również dao, które zwraca kolekcję) lub dao bezpośrednio do kontrolera, bez potrzeby dodatkowej warstwy/klasy, aby uzyskać podstawowy dostęp.
Stosuj tylko klasy usług tam, gdzie to konieczne, w przeciwnym razie masz dwa razy tyle ile potrzeba.
Możesz utworzyć ogólne repozytorium i annoatoate z @Transactional(propagation = Propagation.REQUIRED)
, które wymusza transakcję, ale nie utworzy nowej, jeśli już istnieje. Więc jeśli później użyjesz wielu repozytoriów w jednej metodzie klasy usług, będziesz miał tylko jedną transakcję.
w Pro-Spring-3 książki są wymienione poniżej linii dla sterownika z JPA2
Once the EntityManagerFactory had been properly configured, injecting it into your service layer classes is very simple.
i są one za pomocą tej samej klasy, obsługa i repozytorium, jak w poniżej:
package com.apress.prospring3.ch10.service.jpa;
// Import statements omitted
@Service("jpaContactService")
@Repository
@Transactional
public class ContactServiceImpl implements ContactService {
private Log log = LogFactory.getLog(ContactServiceImpl.class);
@PersistenceContext
private EntityManager em;
// Other code omitted
}
, ale w przypadku, gdy zamierzasz korzystać z wiosennych danych CRUDRepository lub JPARepository, twój DAO będzie interfejsem i będziesz musiał utworzyć warstwę serwisową do obsługi twojego kodu
- 1. Korzystanie z metod PUT i DELETE na wiosnę MVC
- 2. Domeny, DAO i warstwy usług
- 3. Korzystanie z zasady rozkazów Command-Query w kontrolerach MVC
- 4. DTO i koncepcje DAO i MVC
- 5. MultipartConfig z serwletem 3.0 na wiosnę MVC
- 6. tryb deweloperski na wiosnę MVC
- 7. Jak uniknąć powtarzania metod DAO w klasach usług? @Transactional adnotowane DAO i klasy usług - czy jest to dopuszczalna praktyka?
- 8. jak korzystać z wiadomości z freemarkerem w mvc na wiosnę?
- 9. Wzorce PHP - Przykłady usług/modeli/maperów/dao?
- 10. Jak przechowywać sesję na wiosnę MVC
- 11. Jak zarządzać obszarami MVC i funkcją RenderAction w różnych kontrolerach?
- 12. Dynamiczny wybór JsonView na wiosnę Kontroler MVC
- 13. HandlerInterceptor.afterCompletion() na wiosnę MVC zmienia kod odpowiedzi
- 14. otrzymaniu json i deserializacji lista obiektu na wiosnę mvc kontroler
- 15. Wiązanie danych JSON na wiosnę mvc
- 16. Cykl życia sterownika na wiosnę MVC
- 17. pole kombi na wiosnę internetowej MVC
- 18. Co się stanie, jeśli wymienimy adnotację @ service i @repository na wiosnę MVC
- 19. Niejawne kwalifikacje autowiring na wiosnę
- 20. nie można zlokalizować BeanDefinitionParser dla elementu na wiosnę internetowych usług
- 21. DAO na innym serwerze aplikacji
- 22. Wywołanie jednego DAO z innego DAO?
- 23. Korzystanie <MVC: środki ... /> na wiosnę 3 przyczyny wszelkie inne poglądy, aby zatrzymać pracę
- 24. Wykryj limit czasu sesji w żądaniu Ajax na wiosnę MVC
- 25. Jeden DAO na klasę "kontener" lub jeden DAO na stół?
- 26. Wiosna Bezpieczeństwo @PreAuthorize na kontrolerach
- 27. Wzór i relacje dao
- 28. Wiosenna transakcja w usłudze i warstwy DAO
- 29. DAO, wiosna i hibernacja
- 30. Jak stworzyć proces w tle na wiosnę?
Przyszedłem do już istniejącego projektu, kiedy rozpocząłem moją obecną pracę. Jestem tu od nieco ponad roku. Szczerze mówiąc, właśnie zdałem sobie sprawę, że ma być osobna warstwa do wstrzykiwania DAO. Projekt w pracy po prostu wprowadza je do kontrolerów. Skoro już to wiem i jestem gotowy na korzyść atomowości, myślę, że posiadanie warstwy usługowej byłoby dobre, ponieważ w aplikacji mamy wiele interakcji. – theblang