Frage

Ich bin in der Mitte einer "Diskussion" mit einem Kollegen über die beste Art der Umsetzung der data layer in eine neue Anwendung.

Eine Sicht ist, dass die Daten-Schicht sollte bewusst sein, von business-Objekten (unsere eigenen Klassen, die Sie vertreten ein Unternehmen), und in der Lage sein, mit zu arbeiten, die Objekt nativ.

Der entgegengesetzte Standpunkt ist, dass die Daten-Schicht sollte Objekt-Agnostiker, und rein Griff einfache Datentypen (strings, bools, Termine, etc.)

Ich kann sehen, dass beide Ansätze kann gültig sein, aber mein Standpunkt ist, dass ich lieber ersteres.Auf diese Weise, wenn Sie die Daten Speichermedium ändert, werden die business-Schicht nicht (unbedingt) zu ändern, um Platz für die neuen Daten-layer.Daher wäre es eine triviale Sache zu ändern, die aus einer SQL-datenspeicher, um eine serialisierte xml-Dateisystem speichern.

Mein Kollege Sicht ist, dass die Daten, die Schicht sollte nicht zu wissen, über Objekt-Definitionen, und dass so lange wie die Daten übergeben werden über entsprechend, ist das genug.

Nun, ich weiß, dass dies ist eine jener Fragen, die hat das Potenzial zu beginnen, einen religiösen Krieg, aber ich würde schätzen jedes feedback aus der community auf, wie Sie nähern sich solche Dinge.

TIA

War es hilfreich?

Lösung

Es hängt wirklich davon ab, Ihren Blick auf die Welt - ich war in der abgekoppelten Lager.Die DAL wurde nur gibt es zur Bereitstellung von Daten an den BAL - Ende der Geschichte.

Mit aufkommenden Technologien wie Linq to SQL und Entity Framework immer ein bisschen populärer, denn die Linie zwischen DAL und BAL wurden verwischt ein bisschen.In L2S vor allem Ihre DAL ist ganz eng gekoppelt an die Business-Objekte als Objekt Modell hat eine 1-1-Zuordnung zu Ihrer Datenbank-Feld.

Wie alles in der software-Entwicklung gibt es keine richtige oder falsche Antwort.Sie müssen verstehen, Ihre Anforderungen und zukünftige Anforderungen an und arbeiten von dort aus.Ich würde nicht mehr verwenden, einen Ferrari auf der Dakhar Rallye als würde ich einen Range Rover auf einem track Tag.

Andere Tipps

Sie können beides haben.Lassen Sie Daten-layer nicht wissen, Ihre bussiness-Objekte und machen es in der Lage, mit mehr als eine Art von Daten-Quellen.Wenn Sie liefern eine gemeinsame Schnittstelle (oder eine abstrakte Klasse) für die Interaktion mit Daten, können Sie verschiedene Implementierungen für jede Art von Datenquelle.Fabrik-Muster geht hier gut.

Ein ausgezeichnetes Buch, das ich habe, welche sich mit diesem Thema, ist Data Access Patterns, Clifton Nock.Es hat viele gute Erklärungen und gute Ideen auf, wie zu entkoppeln Sie Ihre business-Schicht aus der Persistenz-Schicht.Sie wirklich ausprobieren sollten.Es ist eines meiner Lieblings-Bücher.

Jeffrey Palermo hat einen guten Beitrag zu diesem.Er nannte es Zwiebel-Architektur.

Ein trick, den ich gefunden habe, nützlich ist, um meine Daten-Schicht "collection Agnostiker".Das heißt, wenn ich will, um eine Liste der Objekte aus meiner Datenschicht, bekomme ich die Anrufer-pass in der Liste.Anstatt also diese:

public IList<Foo> GetFoosById(int id) { ... }

Ich mache Folgendes:

public void GetFoosById(IList<Foo> foos, int id) { ... }

Dies ermöglicht mir eine einfache alte Liste, wenn das ist alles, was ich brauche, oder eine intelligentere Implementierung von IList<T> (wie ObservableCollection<T>), wenn ich plan zu binden, um es von der Benutzeroberfläche aus.Diese Technik ermöglicht auch mich zurück Zeug von der Methode, wie ein ValidationResult mit einer Fehlermeldung, wenn eine eingetreten ist.

Dies bedeutet immer noch, dass meine Daten-layer weiß über meine Objekt-Definitionen, aber es gibt mir einen zusätzlichen Grad an Flexibilität.

Check out Linq to SQL, wenn ich erstellen Sie eine neue Anwendung jetzt würde ich überlegen, sich auf eine völlig Linq-basierte Daten-layer.

Außer, dass ich denke, es ist gute übung, um de-paar Daten und Logik so viel wie möglich, aber das ist nicht immer praktisch.Eine Reine Trennung zwischen Logik und Daten stellt access-joins und Optimierungen schwierig, das ist, was macht Linq-so mächtig.

In Anwendungen, worin wir verwenden NHibernate, die Antwort wird "irgendwo dazwischen", in, dass, während der XML-mapping-Definitionen (Sie angeben, welche Tabelle gehört, um welches Objekt und welche Spalten gehören zu dem Bereich, usw.) klar in der business-Objekt-Schicht.

Sie sind an einen generischen Daten-session-manager, die keine Kenntnis von der business-Objekte;die einzige Voraussetzung ist, dass die business-Objekte übergeben, um es für CRUD haben eine mapping-Datei.

Alte post, aber die Suche nach ähnlichen Informationen stieß ich auf diese das erklärt es gut.

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