2010-12-19 13 views
12

Okay, Leute, hier ist ein anderer für YA'LL:Tipps für einen Neuling zu N-Tier-Anwendungen

Ich bin in der n-Tier-Anwendungen Welt zu starten. Ich habe etwas zu diesem Thema gelesen, und der allgemeine Hinweis lautet, dass das Ziel von n-tier apps darin besteht, Funktionalitäts-Tween-Ebenen zu abstrahieren. Also, auf dieser Basis in einem n-tiered App das reguläre Modell ist:

Data Access -> Business Layer -> Presentation

Da ich ein .NET-Entwickler bin, dachte ich, dass die Integration mit mehreren Client-Typen zu verbessern (Silverlight, Web App oder sogar ein WinForms-Client) Ich sollte WCF (Windows Communication Foundation) als Datendienste auf der Business-Schicht verwenden, damit Clients unabhängig von ihrem Typ mit ihm kommunizieren können. Außerdem bin ich ein großer Fan von NHibernate als ORM. So geht meine Struktur wie folgt aus:

Data Access (NHibernate) -> Business Layer (WCF) -> Presentation (WPF, ASP.NET, WinForms

Okay, so dass die Einrichtung ist. Ich bin ein totaler Neuling in dieser Art von Ansatz, also dachte ich, ich könnte hier schreiben und um Rat bei diesem Setup bitten. Ich bin auch sehr verwirrt darüber, wie man das in einer VS-Lösung einrichtet. Ich mag es, Ebenen in verschiedenen Projekten zu trennen, aber was ist mit der Abstraktion von Datenobjekten (wie Kunde, Auftrag usw.)? Lege ich sie in eine separate Bibliothek? Und was ist mit WCF? Ich weiß, es ist ein Programmierfehler, die Datenklassen über die Leitung zum Client zu übertragen. Wie kann der Profi das erreichen?

Danke, jeder Rat würde sehr geschätzt werden.

+0

1 - eine gute Frage, die Probleme auf den Punkt zu bringen. Es kann jedoch ein bisschen subjektiv sein. – Lucero

+0

http://stackoverflow.com/questions/1650887/mixing-nhibernate-with-3-tier-developing – Lucero

+0

Lucero, danke für die Antwort. Ich habe die Frage bereits überprüft, löst einige meiner Zweifel, aber leider mag ich seine Vorgehensweise nicht sehr. Jeder scheint dagegen zu sein, NHibernate-Entitätsobjekte direkt WCF auszusetzen, und das Poster bezieht die WCF-Services tatsächlich auf NHibernate, statt eine Mediator-Serviceklasse zu verwenden. Ich freue mich darauf, so weit wie möglich Abstraktion und Integration zu bieten. –

Antwort

14

Das ist ziemlich im Plan. N-Tier ist jedoch ein wenig komplexer als N-Layer und kann kontrastiert werden, indem man fragt: "Leben Ihre Layer tatsächlich auf separaten physischen Servern?"

Je nachdem, wie komplex Ihre Business-Schicht ist, möchten Sie sie möglicherweise zwischen einer Business- und einer Service-Schicht abstrahieren. Typischerweise sind diese beiden sehr eng miteinander verbunden und leben auf demselben physischen Server. Die Serviceebene fungiert oft als Fassade für Ihren BLL.

Wenn sich der Präsentations-Layer auf demselben Server befindet, könnten Ihre ASP.NET- oder WinForms-Apps möglicherweise mit dem BLL kommunizieren, ohne WCF-Dienste zu durchlaufen.

Lesen Sie weiter auf Microsoft Patterns & Practices - Application Architecture Guide.

Ihre Domain-Objekte sollten in einer eigenen Assembly, typischerweise Ihrem Domänenmodell, leben. Nach Microsoft Framework Design Guidelines, es ist gute Praxis Ihr Projekt Baugruppen entsprechend zu nennen:..

[Unternehmen] [ProductOrComponent] [...]

ich zufällig dieses Format Namens-Abstand mögen und verwenden in der Regel:

....

[Unternehmen] [Artikel] [Schicht] [Teilschicht] [...]

Hier ist ein Beispiel Lösung Lösung Ordner mit jedem Projekt zu organisieren: alt text

I In diesem Beispiel habe ich eine BLL- und Service-Schicht. Die Dienstschicht stellt die tatsächliche Implementierung in einer WCF-Bibliothek bereit, während die Präsentation tatsächlich die WCF-Webanwendung zum Hosten der Dienste enthält. Es ist immer gut, die Implementierung von der Schnittstelle zu trennen.

Der Ordner/Client kann ignoriert werden, ich verwende das nur als eine Beispielkonsole App zum Testen.Alle Client-Anwendungen, die Ihren Service nutzen, sollten wahrscheinlich eine eigene Lösung haben oder Sie werden eine riesige Lösung verwalten.

Da Ihr Datenobjekt über die Leitung übertragen wird ... nehme ich an, Sie meinen die Klassen von Ihrem ORM. (Domain Model) Du hast Recht, es gilt allgemein als schlechte Praxis. Die Lösung verwendet Datenübertragungsobjekte. Sie können aus dem Bild sehen, ich habe eine .Dto-Bibliothek. Wenn Sie in der Lage sind, Tools wie AutoMapper zu verwenden, als ich dafür bin, bringt das Hinzufügen von DTOs zu Ihrer Lösung jedoch weitere Komplexität und Wartung mit sich. Ich glaube, Dino Esposito hat einen guten Artikel zu diesem Thema geschrieben. Wird versuchen, es für dich zu finden.

Hoffe, das hilft.


[EDIT]

Ich sollte anmerken, ich bin nicht vertraut mit nHibernate Fähigkeiten. Es könnte bessere Lösungen für die Verwendung dieses ORM geben. Ich habe nur mit Entity Framework gearbeitet.


[EDIT 2]

Check out Dino Esposito - The Pros and Cons of Data Transfer Objects

+0

Okay, deine Antwort ist sehr einfach und löst so ziemlich jeden Zweifel, den ich hatte. Danke für das VS-Lösungsschema und die Referenzen. Ich denke jetzt stark darüber nach, eine Kopie dieses App Architecture Buches zu kaufen. –

+0

Definitiv ein guter Kauf. Ich habe selbst Kopien der beiden genannten Bücher gedruckt. Große Lese- und Referenzmaterial. – Daniel