Zwykle używam warstwy usług podczas tworzenia aplikacji ASP.NET MVC. Jest podobny do wzorca warstwy usług, który Martin Fowler omawia w książce Patterns of Enterprise Application Architecture . Hermetyzuje logikę biznesową i sprawia, że kontrolery są dość cienkie. Zasadniczo kontrolery używają warstwy usług do pobierania modeli domeny, które są następnie przekształcane w modele widoków. Używam również wzorca projektowego jednostki pracy do obsługi transakcji i wzorca projektowego repozytorium do hermetyzacji warstwy dostępu do danych w celu łatwiejszego testowania jednostkowego i możliwości łatwej wymiany ORMów. Ten rysunek przedstawia typowe warstwy, których używam w aplikacji MVC.
Warstwa usług jest oznaczona na tym diagramie jako „Warstwa aplikacji lub domeny”, ponieważ uważam, że ludzie są zdezorientowani, gdy używa się terminu „Warstwa usług”. Często myślą, że jest to usługa internetowa. W rzeczywistości jest to zestaw, który może być używany przez Twoją ulubioną technologię usług internetowych, na przykład 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żytkowników, miałbym klasę o nazwie MembershipService, która zawiera wszystkie metody potrzebne kontrolerom i usługom sieci Web do wykonywania zapytań i manipulowania domeną członkostwa. Pamiętaj, że możesz mieć kilka domen w tej samej aplikacji, więc 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ą.
Radzę stworzyć oddzielne klasy zwane „usługami”. Umieść je w innym projekcie biblioteki klas (lub przestrzeni nazw) i uniezależnij od infrastruktury platformy MVC. Polecam też użyć jakiegoś rodzaju zastrzyku zależności (najlepiej jest to wstrzyknięcie konstruktora). Twoje klasy usług mogą wtedy wyglądać tak:
public class MyService : IMyService { IFirstDependency _firstService; ISecondDependency _secondService; public MyService(IFirstDependency firstService, ISecondDependency secondService) { } public Result DoStuf(InputDTO) { // some important logic } }
Następnie korzystasz z tych usług ze swoich kontrolerów. Spójrz tu dla kompletnego przykładu.
Według Repozytoriów - radzę nie używać ich, jeśli zamierzasz korzystać z jakiegoś nowoczesnego ORM (NHibernate, EntityFramework), ponieważ Twoja logika biznesowa zostanie hermetyzowana w Warstwie Usług, a Twoja baza danych będzie już hermetyzowana w ramach ORM.
źródło
Zapoznaj się z artykułem z najlepszych praktyk MSDN.
Kod źródłowy aplikacji w artykule można znaleźć tutaj .
źródło
Cytując z „Logika biznesowa powinna być w usłudze, a nie w modelu”? :
W architekturze MVP / MVC / MVVM / MV * usługi w ogóle nie istnieją. A jeśli tak, termin jest używany w odniesieniu do dowolnego ogólnego obiektu, który można wstrzyknąć do kontrolera lub modelu widoku. Logika biznesowa jest w Twoim modelu. Jeśli chcesz utworzyć „obiekty usługowe” do organizowania skomplikowanych operacji, jest to postrzegane jako szczegół implementacji. Niestety, wiele osób implementuje MVC w ten sposób, ale jest on uważany za anty-wzorzec (model domeny anemicznej), ponieważ sam model nic nie robi, to tylko zbiór właściwości interfejsu użytkownika.
Niektórzy ludzie błędnie myślą, że przyjęcie metody kontrolera 100-liniowego i wrzucenie tego wszystkiego do usługi w jakiś sposób tworzy lepszą architekturę. Naprawdę tak nie jest; wszystko, co robi, to dodanie kolejnej, prawdopodobnie niepotrzebnej warstwy pośredniej. Praktycznie rzecz biorąc, kontroler nadal wykonuje swoją pracę, po prostu robi to za pomocą źle nazwanego obiektu „pomocnika”. Gorąco polecam prezentację Jimmy'ego Bogarda Wicked Domain Models, aby uzyskać jasny przykład tego, jak zmienić anemiczny model domeny w użyteczny. Obejmuje dokładne zbadanie modeli, które prezentujesz, i które operacje są rzeczywiście ważne w kontekście biznesowym.
źródło
Wygląda na to, że szukasz czegoś takiego jak wzorzec 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 wzorzec repozytorium dla ASP.NET MVC
źródło