Pracuję nad projektem wykorzystującym hibernację i wiosnę. Hibernacja jest hermetyzowana w warstwie DAO, a warstwa DAO ma również odpowiednią warstwę usługi, a także kontrolery odwzorowane na żądania i strony JSP. Powiedziano mi, żeby nie przekazywać obiektów między tymi warstwami (Kontrolery < -> Service < -> DAO), ponieważ jest to obciążenie wydajnościowe. Jedna konkretna sytuacja polegała na tym, że gdy potrzebowałem zaktualizować wartość logiczną w obiekcie domeny (klasie ORM), napisałem metodę, która przekazała obiekt domeny między warstwą usługi a warstwą DAO, i powiedziano mi, aby przekazał identyfikator obiektu i konkretną wartość logiczną tylko wartość i napisać osobne metody w warstwach dla tego. Czy to jest poprawne? Czuję, że spowoduje to unieważnienie wielu zalet korzystania z narzędzia ORM (Hibernacja). Czy nie mam racji? Wszelkie porady i spostrzeżenia będą przydatne ...Czy obiekt modelu domeny przechodzi między warstwami narzutów?
Odpowiedz
Masz 100% racji. To straszna rada. Przekaż obiekty dookoła. Jest to dokładnie to, do czego został zaprojektowany Hibernate, a "obciążenie związane z wydajnością" w przypadku normalnego przekazywania obiektów jest po prostu szalone. O ile w aplikacji nie ma czegoś, czego nie znasz, bądź ostrożny w stosunku do osoby, która ci to powiedziała.
Podobnie jak w przypadku większości problemów związanych z architekturą, istnieje tu kompromis.
W przypadku aplikacji, które nie przewidują korzystania z architektury zorientowanej na usługi (np. Samodzielna strona internetowa z bazą danych, pojedynczą wewnętrzną aplikacją biznesową), znacznie lepiej jest, aby model domeny był widoczny na wszystkich warstwach podanie. Dzięki temu nie naruszysz zasady DRY (Nie powtarzaj się) i nie musisz robić zbyt wiele refaktoryzacji za każdym razem, gdy dodasz nową właściwość do swojego modelu domeny. Można również użyć frameworka, takiego jak Walidator NHibernate, aby raz zdefiniować całą walidację i użyć tej walidacji zarówno dla warstwy danych, jak i warstwy internetowej.
W przypadku większych aplikacji, które zawierają wiele oddzielnych usług (na przykład duże zestawy wewnętrznych aplikacji biznesowych), pożądane jest oddzielenie ORM od interfejsu usługi. Umożliwi to wprowadzanie zmian w modelach dostępu do danych bez zmiany interfejsu usługi (i na odwrót), co jest niezwykle cenne, gdy wiele innych usług zależy od stabilności interfejsu.
Jednak opisywana sytuacja (przy użyciu metod zmiany określonych właściwości) nie pasuje do żadnego z poniższych scenariuszy: ogólnie zły jest postępować zgodnie z opisanym przez siebie wzorcem, ponieważ powoduje on śledzenie ścieżek wykonania i refaktoryzację bardzo trudne (i może prowadzić do kodu spaghetti). Jedynym możliwym zastosowaniem, o którym myślę, jest to, że twoje modele danych są bardzo duże (blk 5k, itp.), A wysłanie ich przez warstwę usługi generuje duże ilości ruchu. (Uwaga: obiekty C# są dużo mniejsze niż 5k, jeśli serializowane są poprawnie!)
Zalecam przekazanie całego modelu dostępu do danych do warstwy internetowej.
przedwczesna optymalizacja jest źródłem wszelkiego zła
nawet w transakcje wysokiej częstotliwości, gdzie 50 nanosekund względu na to, co robisz, co jest słuszne, a pierwszy następnie zoptymalizować w razie potrzeby. Byłbyś zaskoczony, co mogą zrobić nowoczesne kompilatory/przepustowość sieci.
Aby odpowiedzieć na swoje pytanie bardziej bezpośrednio => przekazać te obiekty i nie myśleć o wydajności. Będziesz, jeśli będziesz musiał później, ale jest to bardzo mało prawdopodobne, że będzie to spowodowane przez przekazywanie obiektów w pobliżu.
- 1. Jaka jest różnica między obiektem modelu MVC, obiektem domeny a DTO
- 2. Czy istnieje przykład bogatego modelu domeny?
- 3. Wiosna i anemiczne modelu domeny
- 4. Czy niepotrzebne są dodatkowe pliki narzutów?
- 5. Jak zakodować metodę rozszerzenia C#, aby przekształcić obiekt modelu domeny w obiekt interfejsu?
- 6. DDD Kiedy należy utworzyć obiekt domeny i obiekt trwałości zamiast używać obiektu trwałości jako obiektu domeny?
- 7. Udostępnianie modelu domeny z usługą WCF
- 8. NSTimer userInfo. Jak obiekt przechodzi do selektora?
- 9. Wartość Injecter: Dto do Modelu Domeny (NHibernate)
- 10. Jak uniknąć zależności między warstwami ze względu na @Constraint validatedBy?
- 11. Różnica między warstwami lokalnymi i gęstymi w CNN
- 12. Interfejs API sieci Web Asp.Net przekazujący użytkownika między warstwami
- 13. Wyświetl weryfikację modelu i sprawdzanie poprawności modelu domeny
- 14. Używanie modelu domeny z wzorcem State State
- 15. Unikanie anemicznego modelu domeny - prawdziwy przykład
- 16. Najlepsze praktyki - mieszanie widoku modelu z modelem domeny
- 17. Udostępnianie obiektów domeny między działaniami
- 18. Mapowanie modelu domeny w celu wyświetlenia modelu za pomocą programu AutoMapper lub nie
- 19. Prześlij obiekt przez dane Transfer do domeny
- 20. jak uniknąć narzutów OpenMP w zagnieżdżonych pętlach
- 21. Jaka jest różnica między modelem domeny i modelem koncepcyjnym?
- 22. Czy istnieje sugerowany wzorzec używania LINQ między warstwami Model i DataAccess w architekturze warstwowej opartej na DDD
- 23. Wykrywanie, czy przeglądarka przechodzi na inną stronę
- 24. Uszkodzenie modelu domeny POCO podczas tworzenia klas jednostek LINQ?
- 25. Określ własności przechodzi między otworem a tagiem zamykającym w XAML
- 26. Jak wysłać obiekt modelu w Html.RenderAction (MVC3)
- 27. Swift UIViewReportBrokenSuperview Przyczyna wywołania przez manipulację warstwami
- 28. Jaka jest różnica między rzutnikiem modelu a rzutnikiem modelu?
- 29. Czy instalujesz biblioteki DLL domeny w GAC?
- 30. Jak sprawdzić, czy dany obiekt datetime jest "między" dwoma datetimes?