Tworzenie warstwy usług dla mojej aplikacji MVC?

Z tego co rozumiem, MVC oddziela definicje klas (model) od prezentacji (Widok) za pomocą "kleju", który jest kontrolerem. Administrator powinien ponosić jedną odpowiedzialność i dlatego być testowany. ViewModels są używane do łączenia danych z wielu podmiotów i do "masowania" danych z kontrolera dla widoku.

Wygląda na to, że logika biznesowa nie ma miejsca... więc myślę, że inna warstwa usług byłaby odpowiednia. Ja tylko nie wiesz, gdzie umieścić tę warstwę lub jak zbudować usługi-czy powinna to być Klasa o nazwie "services", która zawiera kilka funkcji? Jestem trochę nowy w MVC, więc wszelkie materiały do czytania, próbki lub ogólne wskazówki dla początkujących byłyby niesamowite.

Author: johnnyRose, 2013-02-15

5 answers

Zwykle używam warstwy serwisowej podczas tworzenia ASP.NET aplikacja MVC. Jest on podobny do wzorca warstwy usług , który Martin Fowler omawia w wzorcach architektury aplikacji korporacyjnych . Zawiera logikę biznesową i sprawia, że kontrolery są dość cienkie. Zasadniczo Kontrolery wykorzystują warstwę usług, aby uzyskać modele domen, które są następnie przekształcane w modele widoków. Używam również wzoru Unit of Work Design Pattern do obsługi transakcji i wzorzec projektowy repozytorium do hermetyzacji warstwy dostępu do danych w celu łatwiejszego testowania jednostek i łatwego zamiany ORM. ten rysunek pokazuje typowe warstwy, których używam w aplikacji MVC.

Architektura MVC

Warstwa usług jest oznaczona jako "warstwa aplikacji lub domeny" na tym diagramie, ponieważ uważam, że ludzie się mylą, gdy używasz terminu "warstwa usług". Mają tendencję do myślenia, że jest to serwis internetowy. Jest to w rzeczywistości zespół, który może być używany przez Twoje ulubione technologie serwisów internetowych, takie jak ASP.NET Web API lub WCF, a także kontroler.

Jeśli chodzi o konwencje nazewnictwa zwykle używam czegoś, co opisuje domenę, po której następuje usługa. Na przykład, jeśli mam warstwę usług, która obsługuje członkostwo użytkownika, to miałbym klasę o nazwie MembershipService, która ma wszystkie metody potrzebne kontrolerom i usługom internetowym do odpytywania i manipulowania domeną członkowską. Uwaga możesz mieć kilka domen w tej samej aplikacji dzięki temu możesz mieć wiele warstw usług. Chodzi mi o to, że nie musisz mieć jednej monolitycznej usługi, która zajmuje się całą aplikacją.

 105
Author: Kevin Junghans,
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
2013-02-15 14:16:25

Radzę stworzyć osobną klasę o nazwie "usługi". Umieść je w innej bibliotece klas (lub przestrzeni nazw) projektu i uniezależnij od infrastruktury MVC framework. Zalecam również użycie pewnego rodzaju iniekcji zależności (najlepiej jest iniekcja konstruktora). Wtedy twoje klasy usług mogą wyglądać następująco:

 public class MyService : IMyService
 {
     IFirstDependency _firstService;
     ISecondDependency _secondService;

     public MyService(IFirstDependency firstService, ISecondDependency secondService)
     {
     }

     public Result DoStuf(InputDTO)
     {
         // some important logic         
     }
 }

Następnie zużywasz te usługi od swoich kontrolerów. Spójrz tutaj dla pełnego przykładu.

Według mnie - radzę nie użyj ich, jeśli zamierzasz używać jakiegoś nowoczesnego ORM( NHibernate, EntityFramework), ponieważ twoja logika biznesowa zostanie zamknięta w warstwie usług, a baza danych będzie już zamknięta w ramach ORM.

 21
Author: Marian Ban,
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
2014-03-23 21:33:08

Zapraszamy do zapoznania się z artykułem z najlepszych praktyk MSDN.

Kod źródłowy aplikacji w artykule można znaleźć tutaj.

 8
Author: emre nevayeshirazi,
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
2013-02-15 17:08:21

Cytując z "logika biznesowa powinna być w służbie, a nie w modelu"?:

W architekturze MVP/MVC/MVVM/MV* usługi w ogóle nie istnieją. A jeśli tak, termin ten jest używany w odniesieniu do dowolnego obiektu ogólnego, który może być wstrzykiwany do kontrolera lub modelu widoku. Logika biznesowa jest w twoim modelu. Jeśli chcesz tworzyć "obiekty usługowe" w celu zorganizowania skomplikowanych operacji, jest to postrzegane jako szczegół implementacji. Wiele osób, niestety, implementuje MVC w ten sposób, ale to uważany za anty-wzór (anemiczny model domeny), ponieważ sam model nic nie robi, to tylko kilka właściwości dla interfejsu użytkownika.

Niektórzy błędnie uważają, że użycie metody kontrolera 100-liniowego i wepchnięcie go do usługi w jakiś sposób tworzy lepszą architekturę. To naprawdę nie ma; wszystko, co robi, to dodaje kolejną, prawdopodobnie niepotrzebną warstwę indrection. Praktycznie rzecz biorąc, kontroler nadal wykonuje swoją pracę, po prostu robi to za pomocą źle nazwanego obiektu "helper". Gorąco polecam prezentację Jimmy ' ego Bogarda Wicked Domain Models jako jasny przykład, jak przekształcić anemiczny model domeny w przydatny. Polega ona na dokładnym zbadaniu modeli, które wystawiasz i które operacje są rzeczywiście ważne w kontekście biznesowym.

 6
Author: Arvand,
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
2017-04-13 12:45:55

Wygląda na to, że szukasz czegoś w rodzaju wzorca repozytorium. Możesz o tym przeczytać tutaj:

Http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

Ta odpowiedź może również pomóc:

Najlepszy wzór repozytorium dla ASP.NET MVC

 3
Author: jzm,
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
2017-05-23 11:54:39