Frage

Lösung Setup:

  • DAL (Klassenbibliothek)
  • BLL (Klassenbibliothek)
  • Common (Klassenbibliothek (einige gemeinsame Funktionalität - Aufzählungen, Protokollierung, Ausnahmen, ...))
  • Application1 (Windows-Anwendung)
  • Application2 (Windows-Anwendung)
  • WebApp (Web-Anwendung)
  • ...

Lassen Sie sich sagen, ich habe einen Kunden Einheit, die lautet:

  • eine Tabelle in SQL Server
  • a CustomerDataTable in DAL
  • eine Customer-Klasse in BLL
  • a BLL.Customer Klasse bei allen Anwendungen

Welche Objekte sollten BLL und DAL Verwendung für die Kommunikation - DataTable oder List<Customer> (zum Beispiel)? Im ersten Fall sollte BLL Logik Kunden Objekt Datatable zu transformieren und es DAL senden. In secod Fall sollte DAL Schicht von Customer-Klasse bewusst sein, die in BLL Schicht ist. Aber originaly DLL Referenzen DAL und nicht gegenüber ...

setzen sollte ich alle Klassen in separate Baugruppe, die von allen anderen verwiesen wird (Common, Business, ...)? In diesem Fall könnte ich Customer-Klasse in allen meinen Projekten verwenden.

Sollte ich einmal die Mühe zu seperate DAL und BLL, wenn ich weiß, dass nur ein BLL meine DAL verwenden. In diesem Fall konnte ich sie zusammen in einem Projekt zusammenführen.

PS - Ich lese über Tables und eine Menge Leute sagen, dass wir sie gar nicht benutzen sollten. Was gibt bessere Möglichkeiten? Vielleicht ist es Zeit für mich, einige ORM-Mapping-Tools zu lernen:)

War es hilfreich?

Lösung

Meiner Meinung nach sollten Sie eine andere Schicht (separate dll). Wie „Domain“, in dem Sie alle Entitäten wie Kunden halten würde. Dann sind einfach in allen höheren Ebenen (DAL, BLL, UI und andere) in der Hierarchie dieser Versammlung.

Beispielarchitektur wie folgt aussehen:

(Datenbank) <-> DAL <-> BL <-> UI

und auf allen Ebenen haben Sie Zugriff auf „Domäne“ Schicht aufweisen. DAL sollte Liste zurückkehren keine Datentabelle. Auf irgendwann wollen Ihren Entwicklungsprozess Sie können mit würde eine Liste auch in DAL einige OMR wie NHibernate verwenden zurückkehren, wahrscheinlich.

Andere Tipps

Es ist schwer, diese allgemeine Frage zu beantworten, ohne die Anwendungsdomäne gut genug zu kennen. Ich würde mit anfangen, darüber nachzudenken, wo zukünftigen Veränderungen am ehesten und versuche, aus, um herauszufinden, dass dort, wo Flexibilität erforderlich ist.

meine folgenden Gedanken sind nur ein Vorschlag. fühlen Sie sich frei, sie zu betrachten und ändern / ignorieren, was Sie fühlen, ist irrelevant.

die DAL vom BLL trennt, ist fast immer eine gute Idee. das Datenschema ist eine Sache, die vom Rest der Anwendung gekapselt und ausgeblendet werden soll, so dass Ihr DataTables- Dataset, ORMs oder eine andere Lösung in der DAL versteckt lassen. die BLL (und darüber liegenden Schichten) sollen einfache Datentypen (dh einfache Klassen). Ich denke, es wäre eine gute Idee sein, diese Klassen in einer Modell-Klassenbibliothek zu setzen, die keine Referenzen haben und kann überall dort eingesetzt werden.

es fühlt sich an wie Sie ein bisschen zu viel Schichtung haben ... brauchen Sie wirklich eine Customer-Klasse in der BLL und eine weitere in der Anwendungsschicht? sein könnte, aber ich würde sicherstellen, und denke, dass es zweimal.

aus meiner Erfahrung in einem meinem letzten Projekt (eine Wetter Website mit 200K Besuchern täglich), nutzten wir link2sql für den Datenzugriff (meist nur Daten lesen), und einfache Datenklassen alle über unsere ASP.Net MVC-Anwendung ( natürlich als Teil der Modelle / Ansicht Modelle). es funktionierte ganz glatt, und wir konnten ohne zusammenzubrechen andere Schichten, die das Datenschema leicht ändern.

als für Ihre letzte Frage zu DataTables- diese Objekte, sollten Sie sich entscheiden, sie zu benutzen (ich würde dagegen stimmen), gehören ausschließlich in Ihrem DAL. sie sollten nicht in anderen Schichten wie ausgesetzt werden Kopplung mit dieser speziellen Klasse schaffen würde. eine viel bessere Klasse was, wenn erfindet morgen MS? würden Sie jetzt vorbei schalten, dass Sie eine Unmenge Referenzen alle über Ihre Projekte zur DataTables- seiner Methode und Eigenschaften haben? nur Ihre DAL zur Arbeit mit der NewAwsomeDataTable Klasse zu ändern und der Rest Ihrer App wäre schöner sein völlig ahnungslos.

Hoffnung, dass geholfen:)

Ich würde das folgende Muster verwenden, wie es später in einer anderen Persistenz-Strategie aktualisieren kann.

UI/Consumer  <--- (view models) --> BLL <--- Models ----> DAL/Persistence

Hier die Ansicht Modelle sind außerhalb des BLL verbraucht und Modelle sind über die BLL / DAL Schichten kommuniziert werden.

In Ihrem Fall kann das Modell alles sein, die DAL Verwendung - Tables zum Beispiel oder später vielleicht ORM Einheiten. Der BLL ist verantwortlich Zuordnung zwischen dem Modell und Modell-Ansicht.

Wie die Typen in ihren eigenen Versammlungen zu halten - ja für Ansicht Modelle und um eine Konsistenz zu erhalten, ja für die Modelle auch.

Halten Sie die Modelle und Ansichtsmodelle trennen stoppt Leckage der Persistenz Strategien außerhalb des BLL und ermöglicht so Änderungen zukünftige Gestaltung der Beharrlichkeit.

Ein Vorteil dieser Trennung besteht darin, dass, dass unterschiedliche Ansichtsmodell Verbraucher unterschiedliche Ansicht Modelle für die gleiche Persistenz-Modell / Einheit haben kann. Einige können klein und haben nur wenige Attribute und andere große und reich an Funktionalität. Es ermöglicht Ihnen auch vorstellen offline / disconnectedness Fähigkeit als die Ansicht Modelle zu unterschiedlichen Zeiten zurückgeführt werden könnte so dass Sie Daten fusionierenden Strategien entscheiden. Auf diese Weise können Sie auch sind Persistenz Einheiten (zum Beispiel Tabellen wachsen und sich verändern Form). Da das sieht aus wie eine .NET Implementierung Dinge wie AutoMapper wird eine Menge Funktionalität aus der Box

Natürlich ist dies für Ihre Anwendung Art und Weise zu viel des Guten kann - aber ich würde immer noch eine BLL-Mapping behaupten, dass nur Gespräche Modelle für alle BLL Verbraucher anzuzeigen. Dies sollte man genug Entkopplung geben.

Pushing die Bereichseinheiten in die dal ist eine Option, die crcular Abhängigkeit entfernen würde, aber nicht Ihre Absicht entsprechen. Das ist nicht ungewöhnlich, obwohl; zum Beispiel LINQ-to-SQL gnerated Entitäten in der DAL leben würden.

Weitere Optionen:

  • sie in eine gemeinsame setzen senken Montage (aber das kann sich lassen BL ziemlich leer)
  • IOC verwenden entfernen / Rückwärts den Bezug zwischen BL / DAL

Es gibt keine einzige richtige Antworten hier.

Re Datentabelle; persönlich stimme ich - ich bin kein Fan;) Sie können jedoch erfolgreich und sinnvoll genutzt werden. Aber wenn ich had verwenden, um sie, würde ich sie in der DAL als Implementierung detailliert zu halten -. Und sie nicht über dem Aussetzen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top