Design Patterns: Brauchen Sie Hilfe verstehen dieses Konzept und wie sie sich auf mein Projekt

StackOverflow https://stackoverflow.com/questions/4392098

Frage

In den letzten Tagen habe ich viel Forschung getan haben mit der DAL / BLL / UI-Ansatz ohne eine sehr klare Vorstellung davon, wie es zu meinem Projekt gelten. In der Vergangenheit habe ich die BLL verbindet meine UI direkt auf die Data Access Layer ausgelassen (LINQtoSQL dbml). Aber ich glaube nicht, das ist eine gute Idee, wo ich jetzt arbeiten (oder vielleicht sogar in der Vergangenheit), weil wir viele verschiedene Anwendungen haben, und ich möchte die gleiche DAL verwenden / BLL wie sie gebaut werden.

Meine Frage ist, wie funktioniert der BLL mir helfen, wenn in den meisten meiner Anwendungen, alles, was ich wirklich tun verwenden, um die LinqtoSqlDataSource ist / Gridview mein Datacontext zu verbinden alle kümmern sich um die Aktualisierung / bearbeiten, etc. Auch jede neue Web-Anwendung wird auf einer gewissen Ebene erfordern einzigartige Änderungen an der DAL / BLL auf die Daten benötigen zu bekommen, möglicherweise andere Anwendungen die gleiche DAL / BLL beeinträchtigt werden. Ist das eine Wiederverwendung der DAL / BLL der richtige Weg, dies zu tun, oder bin ich etwas fehlt?

Ich denke, die BLL kommt, wenn ich aufbauen müssen, zum Beispiel ein Sicherheitsklasse für die verschiedenen Web-Anwendungen, die gebaut werden. Aber, wenn ich die Linqtosqldatasource verwenden, warum sollte ich die Mühe, es den BLL zu verbinden?

DAL

  • LinqToSQL dbml Datacontext.
  • Does LinqToSQL Änderung mit, wie ich diesen Entwurf verwenden sollte?

BLL

  • Sicherheit für verschiedene Website von Unternehmen verwendet.
  • Abfrage DAL Rückkehr was (?), Wenn LinqToSQLDatSource verwendet. Funktionen, die verschiedenen Ergebnismengen verarbeiten (mir wirklich nicht sicher bin, wie dies mit BLL funktionieren soll, tut mir leid, wenn die Frage ist unklar)

UI

  • Referenz nur die BLL?
War es hilfreich?

Lösung

Die DAL und BLL sind getrennt durch einen oft subtil, aber entscheidenden Unterschied; Geschäftslogik. Sounds moronically einfach, aber lassen Sie mich erklären weiter, weil die Unterschiede sehr fein sein kann und dennoch Auswirkungen Architektur in großen Möglichkeiten.

Mit Linq2SQL erzeugt der Rahmen sehr einfache Objekte, die jeweils einen Datensatz in einer Tabelle darstellen. Diese Objekte sind DTOs; sie sind lightwight, POCO (Plain Ol‘CLR Object) Klassen, die nur Felder haben. Der Linq2SQL Rahmen weiß, wie man instanziiert und diese Objekte aus DB-Daten Hydrat, und in ähnlicher Weise kann es die Daten verdauen in einem in SQLDML enthalten, die die DB Datensatz erstellt oder aktualisiert. Doch nur wenige oder keine der Regeln, die die Beziehung zwischen den Feldern von verschiedenen Objekten, die die auf dieser Ebene bekannt ist.

Ihr tatsächliches Domain-Modell sollte als dies schlauer sein; zumindest klug genug zu wissen, dass eine Eigenschaft auf einem Order-Objekt namens SubTotal sollte die Summe aller ExtendedCosts aller Orderlines, und in ähnlicher Weise gleich sein, das Produkt des Einzelpreises und die Menge ExtendedCost soll. In vielen modernen Programmen bildet Ihre Domain Teil Ihrer BLL, zumindest in diesem Ausmaß. Die Objekte wahrscheinlich von Linq2SQL erstellt sollten nicht alle wissen, dies vor allem, wenn Sie nicht SubTotal oder ExtendedCost sind persistierende. Wenn Sie auf der Linq2SQL DTOs verlassen haben gebunden Sie im Grunde selbst zu dem, was ein Anemic Domain Model genannt wird, das ein bekanntes anti-Muster ist. Wenn das Domain-Objekt selbst nicht konsistent zumindest halten kann, dann jedes Objekt, das Arbeiten mit dem Domänenobjekt vertraut werden muss, es zu halten, dass die Art und Weise, alle diese Objekte erfordern Regeln zu kennen, sollten sie nicht haben.

Die Benutzeroberfläche sollte über die Domäne kennen, oder wenn Sie es vorziehen, soll es etwas abstrahierter Weise kennen, die Daten aus der Domäne für Schreib-Lese-Zwecke (in der Regel in Objekten genannt Controller eingekapselt zu bekommen, die Arbeit mit der Domänenschicht und / oder Linq2SQL). Die Benutzeroberfläche soll nicht über die DB in einem beliebigen Programm von mittlerer Größe oder größer muss wissen; entweder die Domänenobjekte können sich mit einem Verweis auf Objekte in der DAL Hydrat, oder sie werden durch benutzerdefinierte Objekte in der DAL erzeugt, die Sie erstellen die Hydratation zu tun, die dann an die Steuerung gegeben. Das angeschlossene ADO-Modell und Interop mit Gridviews ist bewundernswert, aber es erlaubt keine Abstraktion. Sagen Sie bitte eine Web-Service-Schicht zwischen der Domäne und UI zu ermöglichen, der Benutzeroberfläche zu lokalisierenden in einer mobilen App, die arbeitete mit Daten in Ihrem Lager einfügen wollen. Sie müssten Ihre UI neu zu erstellen, weil Sie nicht mehr Objekte aus Linq2SQL direkt erhalten können; Sie erhalten sie von dem Web-Service. Wenn Sie eine Controller-Schicht haben, die Linq2SQL gesprochen, könnte man diese Schicht mit Controller ersetzen, die den Web-Service gesprochen. Es klingt wie ein kleiner Unterschied; Sie müssen immer etwas ändern. Aber jetzt bist du mit genau der gleichen Benutzeroberfläche auf den mobilen und Desktop-Anwendungen, so dass Änderungen an dieser Schicht haben nicht zweimal nur gemacht werden, da die beiden Schichten Daten unterschiedliche Weise erhalten.

Andere Tipps

Dies ist eine große Frage, die ich nun schon seit einem Jahr mit unserem Katalog App grübelt. Ein spezielles Beispiel für mich, um Sie mit dem Muster helfen.

Ich habe eine Seite, den Inhalt eines Einkaufswagens angezeigt werden soll. In den "frühen Tagen hatte diese Seite ein Gitter durch die Ergebnisse einer gespeicherten SQL-Prozedur bevölkert, dass die Auftragsnummer angegeben, die Artikel in den Warenkorb gelegt aufgeführt.

Jetzt habe ich einen ‚Warenkorb‘ BLL Objekt, das eine Sammlung von ‚Reihe‘ Objekte enthält. Das Gitter ist die gleiche, aber die Datenquelle der Zeilen der Warenkorb gelegt.

Warum habe ich das tun? Zunächst nicht von irgendwelchen ausgefallenen Design-Muster becuase. Ich hatte so viele Sonderfälle in jeder Reihe basierend auf den Feldern zu handhaben und ich hatte andere Orte, die ich mit den gleichen Warenkorb-Inhaltsdaten zu zeigen, benötigt es einfach mehr Sinn gemacht, um die Objekte zu bauen. Nun wird ein Warenkorb Lasten aus einem Repository und meine Seiten haben keine Ahnung, was das Repository. Heck, für die Prüfung, es ist hart codiert Warenkorb Daten.

Der Wagen verwendet dann einen Repository die Zeilen zu laden. Jede Zeile hat die Logik selbst maniuplate, nicht zu wissen, wo die Daten herkommen.

Wir hoffen, das hilft?

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