Normalerweise verwende ich eine Service-Schicht, wenn ich eine ASP.NET MVC-Anwendung entwickle. Es ähnelt dem Service-Layer-Muster , das Martin Fowler in Patterns of Enterprise Application Architecture erläutert . Es kapselt Ihre Geschäftslogik und macht die Controller ziemlich dünn. Grundsätzlich verwenden die Controller die Serviceschicht, um die Domänenmodelle abzurufen, die dann in Ansichtsmodelle umgewandelt werden. Ich verwende auch das Unit of Work-Entwurfsmuster , um Transaktionen abzuwickeln, und das Repository-Entwurfsmuster , um die Datenzugriffsschicht zu kapseln, um das Testen von Einheiten zu vereinfachen und ORMs einfach auszutauschen. Diese Abbildung zeigt die typischen Ebenen, die ich in einer MVC-Anwendung verwende.
Die Serviceschicht wird in diesem Diagramm als "Anwendungs- oder Domänenschicht" bezeichnet, da die Leute verwirrt sind, wenn Sie den Begriff "Serviceschicht" verwenden. Sie neigen dazu zu denken, dass dies ein Webdienst ist. Es handelt sich tatsächlich um eine Assembly, die von Ihrer bevorzugten Webdiensttechnologie wie ASP.NET Web API oder WCF sowie von einem Controller verwendet werden kann.
Für Namenskonventionen verwende ich normalerweise etwas, das die Domäne beschreibt, gefolgt vom Dienst. Wenn ich beispielsweise eine Service-Schicht habe, die die Benutzermitgliedschaft verwaltet, hätte ich eine Klasse namens MembershipService, die alle Methoden enthält, die von Controllern und Webdiensten zum Abfragen und Bearbeiten der Mitgliedschaftsdomäne benötigt werden. Beachten Sie, dass Sie möglicherweise mehrere Domänen in derselben Anwendung haben, sodass Sie mehrere Service-Layer haben können. Mein Punkt ist hier, dass Sie nicht einen einzigen monolithischen Dienst haben müssen, der sich um die gesamte Anwendung kümmert.
Mein Rat ist, separate Klassen namens "Dienste" zu erstellen. Fügen Sie sie in ein anderes Klassenbibliotheksprojekt (oder Namespace-Projekt) ein und machen Sie sie unabhängig von der MVC-Framework-Infrastruktur. Ich empfehle auch eine Art Abhängigkeitsinjektion (die beste ist die Konstruktorinjektion). Dann sehen Ihre Serviceklassen möglicherweise so aus:
public class MyService : IMyService { IFirstDependency _firstService; ISecondDependency _secondService; public MyService(IFirstDependency firstService, ISecondDependency secondService) { } public Result DoStuf(InputDTO) { // some important logic } }
Dann nutzen Sie diesen Dienst von Ihren Controllern. Schauen Sie hier für ein vollständiges Beispiel.
Laut Repositories - mein Rat ist, sie nicht zu verwenden, wenn Sie ein modernes ORM (NHibernate, EntityFramework) verwenden, da Ihre Geschäftslogik in der Serviceschicht gekapselt ist und Ihre Datenbank bereits im ORM-Framework gekapselt ist.
quelle
Lesen Sie den Artikel aus den Best Practices von MSDN.
Der Quellcode der Anwendung im Artikel finden Sie hier .
quelle
Zitat aus "Geschäftslogik sollte in einem Service sein, nicht in einem Modell"? ::
In einer MVP / MVC / MVVM / MV * -Architektur sind überhaupt keine Dienste vorhanden. In diesem Fall bezieht sich der Begriff auf ein generisches Objekt, das in einen Controller oder ein Ansichtsmodell eingefügt werden kann. Die Geschäftslogik ist in Ihrem Modell. Wenn Sie "Serviceobjekte" erstellen möchten, um komplizierte Vorgänge zu orchestrieren, wird dies als Implementierungsdetail angesehen. Viele Leute implementieren MVC leider so, aber es wird als Anti-Pattern (Anemic Domain Model) angesehen, da das Modell selbst nichts tut, sondern nur eine Reihe von Eigenschaften für die Benutzeroberfläche.
Einige Leute denken fälschlicherweise, dass eine 100-Zeilen-Controller-Methode, die alles in einen Dienst umwandelt, irgendwie zu einer besseren Architektur führt. Das tut es wirklich nicht. Alles, was es tut, ist eine weitere, wahrscheinlich unnötige Indirektionsebene hinzuzufügen. In der Praxis erledigt der Controller die Arbeit immer noch, nur über ein schlecht benanntes "Helfer" -Objekt. Ich empfehle Jimmy Bogards Präsentation " Wicked Domain Models" als ein klares Beispiel dafür, wie aus einem anämischen Domain-Modell ein nützliches wird. Dabei wird sorgfältig geprüft, welche Modelle Sie verfügbar machen und welche Vorgänge in einem Geschäftskontext tatsächlich gültig sind.
quelle
Klingt so, als würden Sie nach einem Repository-Muster suchen. Sie können hier darüber lesen:
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-anwendung
Diese Antwort hier kann auch helfen:
Bestes Repository-Muster für ASP.NET MVC
quelle