2008-10-07 6 views
5

Beim Entwerfen von Geschäftsobjekten habe ich verschiedene Methoden zum Schreiben der Datenzugriffsschicht ausprobiert. Einige haben sich besser entwickelt als andere, aber ich habe immer gefühlt, dass es einen "besseren" Weg geben muss.Business Objekt DAL Design

Ich möchte wirklich nur die verschiedenen Möglichkeiten sehen, wie Menschen die DAL in verschiedenen Situationen behandelt haben, und ihre Meinung darüber, wie die Technik funktioniert oder nicht gut funktioniert hat.

Antwort

2

Leider glaube ich nicht, dass es einen "besseren Weg" gibt, es hängt zu sehr von der spezifischen Situation ab, welcher DAL-Ansatz Sie verwenden. Eine großartige Diskussion über den "Stand der Technik" ist Patterns of Enterprise Application Architecture von Martin Fowler.

Kapitel 10, Datenquelle Architekturmuster bezieht sich speziell auf die meisten der am häufigsten verwendeten Muster für Geschäftsanwendungen.

Im Allgemeinen habe ich gefunden, dass die Verwendung des einfachsten Ansatzes, der die grundlegenden Wartbarkeits- und Anpassungsfähigkeitsanforderungen erfüllt, die beste Wahl ist.

Zum Beispiel bei einem kürzlichen Projekt war ein einfaches "Row Data Gateway" alles was ich brauchte. (Dies waren einfach Code-generierte Klassen für jede relevante Datenbanktabelle, einschließlich Methoden zum Ausführen der CRUD-Operationen). Keine endlosen Debatten über ORM im Gegensatz zu gespeicherten Procs, es hat einfach funktioniert und die erforderliche Arbeit gut gemacht.

+0

Ich stimme zu, dass für verschiedene Situationen die Antwort anders sein wird, aber ich suche nur nach verschiedenen Techniken und wie sie geklappt haben. –

1

Es gibt mehrere gemeinsame Muster. 'The patterns of enterprise architecture' Buch ist eine gute Referenz für diese:

  • Table Data Gateway
  • Row Data Gateway
  • Active Record
  • Data Mapper

Wenn Sie ein ORM, wie LLBLGen verwenden, Sie haben die Wahl zwischen Selbstbedienung oder Adapter.

4

Ich habe mich jetzt stark auf Billy McCafferty's NHibernate Best Practices article/sample code für viele Web/WinForms-Anwendungen verlassen. Es ist ein wunderbar geschriebener Artikel, der Ihnen eine gute solide Sample-Architektur bietet - zusätzlich zu den Grundlagen von NHibernate und TDD. Er versucht Ihnen einen Überblick über seine Architektur- und Designentscheidungen zu geben.

Er erstellt eine sehr elegante DAL mit generischen DataAccessObjects, die Sie für jedes Domain-Objekt erweitern können - und es ist sehr locker mit der BL über Schnittstellen und eine DAOFactory gekoppelt. Ich würde empfehlen, zuerst die BasicSample zu betrachten, vor allem, wenn Sie noch nicht mit NHibernate gearbeitet haben.

Hinweis, dieser Artikel basiert stark auf NHibernate, aber ich denke, der allgemeine Ansatz könnte leicht geändert werden, um andere ORMs anzupassen.

1

Wenn Sie die NHibernate-Route (guter Artikel Link BTW von @Watson oben) gehen, dann würde ich dringend empfehlen, dass Sie das Suvius-Flamingo-Beispielprojekt von cobebetter auschecken. Er hat ein sehr schönes, prägnantes Beispielprojekt, das MVC und NHibernate in Aktion zeigt.

Hier ist die suvius-flamingo link.

1

[Update] das ist nicht mehr gültig ist, wurde das Design des Projekts geändert [/ Update]

In unserem Open-Source-Projekt Bunian schlossen wir, dass die Business Objects (die gesamte Komponente) ist der Kern das System, und alles sollte sich um ihn drehen, einschließlich der Datenzugriffsschicht.

Die Business-Komponente wird anderen diktieren, was sie benötigt, und zwar durch itnerfaces. Zum Beispiel hat das Business-Objekt die Person ein Schnittstellenelement namens IRepositoryForPerson, diesem Member wird bei Bedarf eine Instanz über den Dependency-Injektionscontainer zugewiesen.

Für weitere Informationen überprüfen Sie mein Blog-Post hier:

http://www.emadashi.com/index.php/2008/11/data-access-within-business-objects-bunian-design//

und überprüfen hier Bunian Code (obwohl es noch Amateur ist):

http://www.codeplex.com/Bunian

Natürlich wird neu entstehenden Dinge mit diesem Ansatz wie der Lebenszyklus der Datenzugriffssitzung (wenn Sie beispielsweise NHibernate verwenden). aber das für eine andere Frage wäre, ich denke :)

ich hoffe, dass Sie diesen Kommentar hilfreich

1

Ich gehe davon werde Ihnen eine DAL mean schreiben, die SQL zugreift, da dies die häufigste Teil heute ist. ONe, wenn das größte Problem beim Schreiben einer DAL gegen SQL der ORM-Teil ist. Das heißt, es gibt eine fundamentale Impedanzfehlanpassung zwischen OO-Programmierung und relationalen Datenbankschemata. Es gab viele großartige, sogar erfolgreiche Versuche, ORMs zu schreiben. Aber alle leiden unter dem gleichen Problem, das ihr Vorteil ist: Sie abstrahieren Sie weg von dem zugrunde liegenden SQL, das generiert wird. Warum dies ein Problem ist, ist, dass die Leistung Ihrer Datenbank eine kritische Komponente davon ist, wie gut Ihr System insgesamt funktioniert. Viele ORMs (vielleicht die meisten) haben nicht nur eine für viele Standardabfragen weniger als stellare Leistung, sondern ermutigen tatsächlich zu Nutzungsmustern, die die Leistung erheblich beeinträchtigen (wiederholtes Durchlaufen von Beziehungen innerhalb von Schleifen, wenn das Abfragen von Sammlungen ein häufiges Beispiel ist) Ein weiterer). Nachdem Sie die ORM-API im Detail gelernt haben, können Sie in der Regel nach Wegen zu diesen Performance-Schlaglöchern suchen.

Meine aktuelle Meinung über den Zustand von ORMs ist, dass ich möchte, dass es so wenig wie möglich macht, während es mir immer noch die Effizienz einer soliden Bibliothek gibt, die sich um alle Details des Datenzugriffs kümmert. Mit anderen Worten, weil ich denke, dass sie noch nicht "gut genug" sind und vielleicht nie mit SQL als Backend arbeiten, möchte ich die Kontrolle auf der Bare-Metal-Ebene behalten und ich werde auf SQL schreiben Hand, ohne zu zögern in vielen Fällen, unabhängig von der ORM, weil ich die spezifische Art und Weise weiß, wie die Daten für meine Bedürfnisse abgefragt werden sollen.

Dies ist offensichtlich ein spröderer Ansatz für die Codierung als wenn Sie das ORM religiös verwenden, wie es beabsichtigt war, so dass Sie besonders sorgfältig in Bezug auf Komponententests, SQL-Injektion und ordnungsgemäße Trennung von Bedenken sein müssen . Also, um es zusammenzufassen, stimme ich Ash zu, obwohl das nicht bedeutet, dass er/sie mit mir einverstanden ist :)