Fat model / thin controller vs. Service layer [zamknięty]

Od wielu lat zajmuję się tworzeniem aplikacji korporacyjnych z wykorzystaniem. Net Moje aplikacje zwykle mają model domeny zawierający encje mapujące do tabel SQL DB. Używam wzorca repozytorium, iniekcji zależności i warstwy usług.

Ostatnio zaczęliśmy pracować nad projektami MVC 3 i odbyliśmy debatę, gdzie umieścić jaką logikę. Przyszedłem po architekturze thin Controller / Fat Model i zastanawiałem się, jak warstwa usług będzie pasować do

Opcja 1-Model rozmawia z Usługi

Kontroler jest cienki, wywołuje metody na modelach. Modele "wiedzą", jak ładować się z bazy danych i rozmawiać z repozytoriami lub usługami. Na przykład customerModel posiada metodę Load (id) i ładuje klienta oraz niektóre obiekty potomne, takie jak GetContracts().

Opcja 2-kontroler rozmawia z usługami

Controller prosi usługi o pobranie obiektów modelu. Logika ładowania / przechowywania itp. Jest w warstwie usług. Model jest czystym modelem encji z danymi tylko.

Dlaczego opcja 1 byłaby lepszym wyborem, zwłaszcza gdy mówimy o aplikacjach korporacyjnych moje doświadczenie mówi mi, aby oddzielić obawy, utrzymać modele i kontrolery tak cienkie, jak to możliwe i mieć wyspecjalizowane usługi wykonujące logikę biznesową (imcl. Interakcja DB)

Dzięki za wszystkie porady i odniesienia do dobrych zasobów.

Author: one.beat.consumer, 2012-01-05

4 answers

Wszystko to zależy od intencji i wymagań aplikacji.

To powiedziawszy, oto moja propozycja dla" średniej skali " (nie lokalnej restauracji, a nie Twitter/Facebook) aplikacji internetowych.

  1. Lean Domain Modeling

    Suche obiekty w stylu poco, najlepiej ignorujące architekturę MVC Twojej aplikacji internetowej, aby pozostały jak najbardziej luźno powiązane z konkretną implementacją.być może nawet przepakować bibliotekę klas-zdolną do wykorzystania w aplikacja zewnętrzna, np. REST API poprzez usługę WWW WCF).

    " Model " w MVC najdokładniej oznacza model, którego kontroler jest świadomy, a więc model przeznaczony dla widoku.

    W mniejszych (często Samouczkowych) aplikacjach modele encji "warstwy modelu aplikacji/domeny" są często tymi samymi instancyjnymi obiektami, które kontroler wysyła do widoku.

    W większych aplikacjach programiści często stosują zasady architektury MVVM i zacznij używać oddzielnych obiektów modelu widoku. Kontrolery często nazywają usługi średniego poziomu, które współpracują z niewidocznymi podmiotami poniżej. W tym scenariuszu M W MVC najdokładniej oznacza model widoku.

  2. Solidna Warstwa Serwisowa

    Nie oznacza to } } logiki, ale dobrze napisane usługi jednego celu. Podczas gdy kodowanie logiki biznesowej w usługach poza modelem jest nieco bardziej "proceduralne" niż czyste "OOP", bardzo pomaga w luźnym łączenie, Testowanie i elastyczne wdrażanie (np. n-tier deployment).

    W mojej osobistej praktyce koduję usługi zarówno w warstwie danych, co uważam za moje modelowanie behawioralne obiektów POCO (mechanika trwałości, Walidacja niskiego poziomu itp.), oraz usługi wyższego poziomu (funkcja business/workflow) bliżej mechaniki MVC.

  3. Kontrolery Lean

    Upewniam się, że mój kontroler to tylko trener , ponieważ nie jest to ani Zagraj (usługi) lub gracz (model podmiotu lub model widoku), ale po prostu decyduje, kto gra na jakiej pozycji i jaką grę wykonać. Moje Kontrolery robią dwie rzeczy:

    1. Usługi połączeń, które współdziałają z modelami entity / domain

    2. Przygotuj model widoku dla odpowiedniego widoku.

    Nawet uwierzytelnione / autoryzowane działania kontrolera są wykonywane za pomocą wtryskiwanych usług / atrybutów.


EDIT 1:

Pamiętaj, że nie oznacza to, że Twój model podmiotu/domeny jest lub musi być anemiczny. Orm, repozytoria i fabryki, Walidacja lub mechanika Państwowa są mile widziane. Oznacza to tylko dla aplikacji o umiarkowanej skali, model w MVC reprezentuje model przeznaczony dla kontrolera, aby przekazać go do widoku .

Miejmy nadzieję, że ten punkt uspokoi wszystkich, którzy wierzą, że anemiczny model danych jest anty-wzorzec. W tym samym czasie Czy odzwierciedla nieco bardziej proceduralny kąt niż OOP, gdzie bardziej czyste jest włączenie zachowania w modelowanych klasach.

Nie ma "ostatecznej prawdy" , ale za pomocą tego wzorca można łatwo budować, testować i wdrażać aplikacje - przy zachowaniu dużej możliwości ponownego użycia i skalowalności.


Edytuj 2:

To powiedziane, nawet dla skromnych zastosowań, nad architekturą (że słowo kujony wymyślił?) system jest zbyt powszechny. Na instancja, owijanie ORM wzorcem repozytorium, a następnie pisanie usług do korzystania z repozytorium... wszystko to jest dobre dla oddzielenia troski i takich, ale jeśli twój projekt nie wymaga (i nie jest bardzo prawdopodobne, aby {13]}wkrótce {14]} wymagać) takich rzeczy, nie buduj go. Nie ma nic złego w pomijaniu repozytorium razem, pisząc cienkie usługi biznesowe(np. klasy zapytań) w stosunku do ORM, lub nawet gdy twój kontroler rozmawia bezpośrednio z nim. Wszystko zależy od skala.


Edytuj 3:

Chciałem zauważyć, że to wyjaśnienie i porady dotyczą kontekstu architektury MVC po stronie serwera, jak ASP.Net, nie dla klent-side frameworków takich jak Knockout czy Backbone.

 88
Author: one.beat.consumer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 17:07:14

Musisz wiedzieć więcej o MVC, zanim przejdziemy do dyskusji, gdzie umieścić wszystko. Jeśli chcesz podążać za wzorcem. W przeciwnym razie możesz przestać czytać.

Wzór jest bardzo luźno zdefiniowany. Nic nie mówi, jak powinien wyglądać kontroler, widok lub model, ani jak powinien być skonstruowany. Wzór po prostu stwierdza, że należy rozdzielić części i jak powinny one ze sobą współdziałać. Przyjrzyjmy się więc nieco więcej o tym, czym są (Mój interpretacja).

MVC

Model Model może być wszystkim. Może to być serwis internetowy, repozytoria, klasy usług lub po prostu modele domen. Model to wszystko, co służy do uzyskania potrzebnych informacji. Rozważ "Model" jako warstwę, a nie tylko pojedynczy obiekt.

Controller Kontroler to klej. Pobiera informacje z modelu i dostosowuje je do widoku i odwrotnie.

Widok Widok powinien renderować tylko to, co widzi użytkownik.

Należy pamiętać, że nie należy mylić modelu z modelami widoku. Microsoft powinien naprawdę nazwać folder" Model ""ViewModels", ponieważ tym są. Nie użyłbym informacji z "modelu" bezpośrednio w widokach. Nieprzestrzeganie tego oznaczałoby, że musisz zmienić Model, jeśli Widok zostanie zmieniony i na odwrót.

Odpowiedź

Model nie jest modelem widoku, ale warstwą. Wszystko w modelu jest używane aby pobrać informacje potrzebne do widoku. Kontroler pobiera te informacje i umieszcza je w modelu pojedynczego widoku.

Pojedyncza akcja kontrolera może używać jednego lub kilku wywołań do "modelu", aby móc zebrać informacje potrzebne w widoku.

Oznacza to, że druga opcja jest najbardziej poprawna, jeśli chcesz uzyskać aplikację, która jest łatwa w utrzymaniu i rozszerzaniu.

Należy pamiętać, że warstwa usług może nie być potrzebna. Możesz zadzwonić do OR / M bezpośrednio od kontrolerów. Jeśli jednak zdublujesz kod lub dostajesz Kontrolery fat, po prostu przenieś logikę do warstwy usług. Zmiana ta nie wpływa na nic poza kontrolerem, ponieważ używasz odpowiednich modeli widoków.

 16
Author: jgauffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-12 19:07:11

Opcja 1: Można by pomyśleć, że ten model = = serwis. Model jest również warstwą biznesową.

Opcja 2 to anemiczny model domeny anty-pattern. http://en.wikipedia.org/wiki/Anemic_domain_model

 0
Author: Imre L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 23:28:15

Opcja 2 jest czymś, co jest opisane jako fat Stupid Ugly Controllers architecture (odniesienie do autora tego wyrażenia ). Rozwiązanie to jest na ogół sprzeczne z duchem MVC, ponieważ łamie oddzielenie obaw.

 0
Author: Sergey Kudriavtsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-13 06:57:23