ASP.NET MVC3 - 3-Tier-design - Transaktion Kontroll-und business-Schicht-design Fragen
Ich bin der Gestaltung eines ASP.NET MVC3-Anwendung, und ich möchte eine klare Trennung der Interessen in einem 3-Schicht-Architektur. Ich bin mit Fluent NHibernate als ORM, die Repository-pattern für die Arbeit mit den Entitäten zugeordnet, die von NHibernate. Ich möchte hinzufügen, eine richtige business-Schicht mit einer Unit Of Work pattern, halten die MVC-Teil nur für die Präsentation (durch die Verwendung von ViewModels, die Karte, um die nHibernate Unternehmen über die business-Schicht). Dieser Artikel beschreibt die kombinierte 3-tier und MVC-Architekturen schön.
Gemäß dieser MVC + - Einheit von Arbeit + repository Artikel sehe ich nicht eine klare Unterscheidung von ein business-Schicht. Die Einheit von Arbeit, Klasse präsentiert, stark typisierte Getter für jedes repository-Typ, der schaut, geeignet für eine business-Schicht. Jedoch, es stellt eine Methode zum Speichern, die ich denke, würde übersetzen, um BeginTransaction und CommitTransaction Methoden mit nHibernate. Dies wirft einige Fragen auf:
1) Ist die Offenlegung der Transaktion die Kontrolle zu MVC-eine gute Idee? Auf welcher Stufe sollte die Transaktion Kontrolle passieren? Mir scheint, dass MVC sollten nicht verantwortlich für Transaktionen, aber wie kann man das vermeiden?
2) Sollte es werden einige automatische Weg, um Transaktionen? Das ActionFilter Umsetzung ist semi-automatisch, aber die transaction control ist eindeutig in der MVC-Abschnitt, der nicht der business-Schicht.
3) Ist das UnitOfWork-Klasse das gleiche wie ein business-Schicht-Klasse?
- wenn dem so ist, bedeutet das, wir können fügen Sie benutzerdefinierte business-logic-Methoden in es?
- wenn nicht, wickeln wir die Einheit der Arbeit mit einigen anderen Klasse(N) enthält, die business-logic-Methoden?
Ich Schätze irgendwelche Ideen oder Beispiele. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst möchte ich zur Klärung ein wenig mis-Konzeption über die business-Schicht, wie Sie möchten, so verwenden Sie das Repository-pattern und Ihre Einrichtung ist auch ein Kandidat Domain-Driven Design, dann die business-Schicht ist eigentlich [Domain Model ( Entitäten und Wertobjekte , wo Sie entwerfen Sie Ihre business-Logik in einer Objekt-orientierten Art und Weise in Unternehmen und Objekte) und die Application-Ebene zu koordinieren, Transaktionen und Operationen und Befehle, um die domain-Schicht], so wird die vorgeschlagene Architektur wäre so etwas wie dieses:
Beispiel-Szenario:
[Präsentation] OrderController:
[Anwendung] - OrderService:
Über Ihre Fragen:
1) Ist die Offenlegung der Transaktion die Kontrolle zu MVC-eine gute Idee? Auf welcher Stufe sollte die Transaktion Kontrolle passieren? Mir scheint, dass MVC sollten nicht verantwortlich für Transaktionen, aber wie kann man das vermeiden?
Nein, ich würde es vorziehen, zu trennen, die im application-layer, um zu erstellen, das design flexibel zu unterstützen, verschiedene Präsentationen.
2) Sollte es werden einige automatische Weg, um Transaktionen? Das ActionFilter Umsetzung ist semi-automatisch, aber die transaction control ist eindeutig in der MVC-Abschnitt, der nicht der business-Schicht.
Verwenden Transaktionen, die im application-layer.
3) Ist das UnitOfWork-Klasse das gleiche wie ein business-Schicht-Klasse?
- wenn dem so ist, bedeutet das, wir können fügen Sie benutzerdefinierte business-logic-Methoden in es?
- wenn nicht, wickeln wir die Einheit der Arbeit mit einigen anderen Klasse(N) enthält, die business-logic-Methoden?
Nein, es ist nur ein Weg, um Gruppen-tasks in die Geschäfte.
Die business-Logik ist eigentlich gekapselt in Entitäten und wenn die Logik nicht in Beziehung zu einer Person umgesetzt werden sollten, domain-services [Flughafenuebertragungen.Transfer(account1, account2, Betrag)], für co-Ordinationen, Zugriff auf repositories, und Transaktionen der application layer ist der Platz.
Haben Sie schaute in die S#arp-Architektur? Es hat eine eingebaute MVC-Transaction handling -, Aktions-Filter.
Ich bin in der Regel eine Schichtung Puristisch, so war ich nicht begeistern lassen MVC öffnen Sie die Sicht, aber ich bin gekommen, es zu mögen.
Gibt es pro 's und con' s, aber hier sind einige Vorteile der Open Session In View pattern.:
Wenn Sie nicht wollen, zu gehen, mit S#arp, können Sie noch implementieren, Open-Session-In-View-selbst mit nur ein paar Zeilen code in einem ActionFilter. Auf die Aktion Ausführen-Methode, die Sitzung eröffnen. In der action-Methode ausgeführt, commit, close und dispose. Dies ist, was wir tun, auf mein Projekt und es hat funktioniert gut für uns.
Das problem, das Sie mit jedem web-basierten app ist, dass es einige Kopplung der UI an die Geschäfts-Schicht durch die Notwendigkeit, Sie zu verwalten-Objekt-Lebenszeit durch die HTTP-Sitzung. In einer typischen desktop-Anwendung, die Sie nicht haben, um sorgen über die Sitzungen, so macht es leicht zu bewegen, alle Transaktions-handling weiter unten in der Kette.
Überlegen, wo Sie wollen, um die Wiederverwendung der gleichen Logik in den drei apps, eine Web Site, ein Web-Service, und eine Desktop-Anwendung. Ohne daß die Handhabung der Transaktionen auf der präsentationsebene, es gibt keinen guten Weg, um mit der Transaktion verpflichtet, denn die business-Schicht ist unwissend, wie lange die Objekte existieren.
So ist Ihre Wahl, entweder stellen Sie sicher, dass Sie verpflichten sich, alles in jeder Methode, Ihre Business-Objekte oder setzen Sie die Transaktion auf die UI.
Eine Dritte alternative wäre der Aufbau einer Recht komplexen session-management-controller, die ich don ' T sogar wollen, zu denken... Das session-management-controller gekoppelt werden können, um die Benutzeroberfläche und die business-Logik, trennen Sie zum Teil.. das würde Aber erfordern viel mehr Analyse.