Ist das Schreiben einer eigenen Datenzugriffs- / Datenzuordnungsschicht eine „gute“ Idee?


20

Wir befinden uns derzeit in einer Situation, in der wir die Wahl zwischen der Verwendung eines gebrauchsfertigen objektrelationalen Mapper und dem Rolling unseres eigenen haben

Wir haben eine Legacy-Anwendung (ASP.NET + SQL Server), in der die Daten- und Business-Schicht leider zusammengeführt werden. Das System ist im Hinblick auf den Datenzugriff nicht besonders kompliziert. Es liest Daten aus einer großen Gruppe (35-40) zusammengehöriger Tabellen, bearbeitet sie im Speicher und speichert sie in einer Zusammenfassung in einigen anderen Tabellen. Wir haben jetzt die Möglichkeit, einige Umgestaltungen vorzunehmen, und suchen nach geeigneten Technologien, um unseren Datenzugriff zu trennen und ordnungsgemäß zu strukturieren.

Für welche Technologie wir uns auch entscheiden, wir möchten:

  • haben POCO-Objekte in unserem Domain-Modell, die Persistence Ignorant sind
  • Haben Sie eine Abstraktionsschicht, die es uns ermöglicht, unsere Domänenmodellobjekte mit einer nachgebildeten zugrunde liegenden Datenquelle zu testen

Offensichtlich gibt es schon eine Menge Sachen in Bezug auf Patterns & Frameworks usw.

Persönlich dränge ich auf die Verwendung von EF in Verbindung mit dem ADO.NET Unit Testable Repository Generator / POCO Entity Generator . Es erfüllt alle unsere Anforderungen, kann problemlos in einem Repo / UnitOfWork-Muster gebündelt werden, und unsere DB-Struktur ist ausgereift (nachdem wir bereits einen Refaktor durchlaufen haben), sodass wir nicht täglich Änderungen am Modell vornehmen werden.

Andere Mitglieder der Gruppe schlagen jedoch vor, unsere eigene DAL komplett neu zu erstellen. (Benutzerdefinierte DataMappers, DataContexts, Repository, Schnittstellen überall, Übermaß an Abhängigkeitsinjektion zum Erstellen konkreter Objekte, Benutzerdefinierte LINQ-zu-zugrunde liegende Abfrageübersetzung, Benutzerdefinierte Caching-Implementierungen, Benutzerdefinierte FetchPlan-Implementierungen ...) Ich als Wahnsinn.

Einige der vorgebrachten Argumente sind "Nun, zumindest werden wir unseren eigenen Code kontrollieren können" oder "Oh, ich habe L2S / EF in einem früheren Projekt verwendet und es war nichts als Kopfzerbrechen". (Obwohl ich beide bereits in der Produktion verwendet habe und festgestellt habe, dass es nur wenige und sehr überschaubare Probleme gibt)

Hat einer Ihrer übererfahrenen Entwickler / Architekten irgendwelche Weisheiten, die mir helfen könnten, dieses Produkt von dem wegzulenken, was ich für eine völlige Katastrophe halte? Ich kann nicht anders, als zu glauben, dass jeder Nutzen, der durch das Ausweichen von EF-Problemen erzielt wird, genauso schnell verloren geht, wenn man versucht, das Rad neu zu erfinden.


4
Es gibt einige gute Alternativen (besser, wenn Sie mich fragen, aber ich werde diesen heiligen Krieg nicht anfangen ... oh warte) zu EF, bei denen Sie in der Lage wären, "den Code zu kontrollieren", wie z. B. NHibernate.
Brook

@Brook Wie geht das mit der Frage um, ob das Schreiben einer eigenen Datenzugriffs- /
MickyD

Antworten:


22

Beide Argumente gegen bestehende ORMs sind ungültig:

"Naja, zumindest haben wir die Kontrolle über unseren eigenen Code."

Warum schreibst du nicht deine eigene Sprache? Dein eigenes Framework? Dein eigenes Betriebssystem? Um sicherzugehen, dass Sie die Kontrolle über alles haben, ist es auch eine gute Idee, Ihre eigene Hardware zu erstellen.

"Oh, ich habe L2S / EF in einem früheren Projekt verwendet und es war nichts als Kopfschmerzen."

EF ist ausgereift genug und wurde von vielen Menschen erfolgreich eingesetzt. Es bedeutet, dass eine Person, die behauptet, dass EF nichts als Kopfschmerzen ist, wahrscheinlich anfangen sollte, den richtigen Umgang mit EF zu lernen.


Müssen Sie also Ihren eigenen ORM schreiben?

Das würde ich nicht vorschlagen. Es gibt bereits professionelle ORMs, was bedeutet, dass Sie nur dann Ihre eigenen schreiben müssen, wenn:

  • Sie haben einen genauen Kontext, in den aus irgendeinem Grund nicht alle vorhandenen ORMs passen.
  • Sie sind sich sicher, dass die Kosten für das Erstellen und Verwenden Ihres eigenen ORM viel geringer sind, als für das Erlernen eines vorhandenen. Dies beinhaltet die Kosten für zukünftigen Support, einschließlich eines anderen Entwicklerteams, das Hunderte von Seiten Ihrer technischen Dokumentation lesen müsste, um zu verstehen, wie Sie mit Ihrem ORM arbeiten.

Natürlich verbietet Ihnen nichts, Ihren eigenen ORM nur aus Neugier zu schreiben, um Dinge zu lernen. Aber Sie sollten es nicht in einem kommerziellen Projekt tun.


Siehe auch Punkte 2 bis 3 meiner Antwort auf die Frage Das Rad neu erfinden und es NICHT bereuen. Sie sehen, dass die verschiedenen Gründe für die Neuerfindung des Rades hier nicht zutreffen.


10
1. Die Kontrolle über geschäftskritische Teile des Systems zu haben, ist oft eine gute Idee. Manchmal kann es erforderlich sein, ein eigenes Framework zu schreiben, anstatt eine etablierte und beliebte Bibliothek zu verwenden. 2. Manchmal sind beliebte Tools überverkauft oder überlistet.
quant_dev

3
@quant_dev: Wenn Sie eine Software schreiben, die ein Kernkraftwerk oder ein Raumschiff steuert, haben Sie Recht. Ich habe jedoch einige Zweifel, dass dies hier der Fall ist. Übrigens bin ich mir nicht sicher, ob wir EF als "etablierte und beliebte Bibliothek" bezeichnen können.
Arseni Mourzenko

3
Es gibt eine bekannte Open-Source-Bibliothek für Derivatepreise namens Quantlib. Aber jede Bank, die ich kenne, schreibt ihre eigenen Preisbibliotheken, weil dies der Kern ihres Geschäfts ist. Muss kein Raumschiff sein ...
quant_dev

2
Es ist auch einfacher, neue Mitarbeiter einzustellen, die Erfahrung mit dem von Ihnen verwendeten Standard-Framework haben, als jede einzelne Person, die Sie einstellen, in der Verwendung des Frameworks zu schulen.
HLGEM

2
Warum schreibst du nicht deine eigene Sprache? Dein eigenes Framework? Dein eigenes Betriebssystem? Und um sicherzugehen, dass Sie die Kontrolle über alles haben, ist es auch eine gute Idee, Ihre eigene Hardware zu erstellen. Das hat Apple gesagt :-)
Konamiman

19

Verwenden Sie Entity Framework für alle normalen CRUD-Inhalte (80 bis 95 Prozent des Codes) und verwenden Sie benutzerdefinierten Datenzugriffscode für den verbleibenden Code, der optimiert werden muss. Dies sollte die Bedenken derer befriedigen, die argumentieren, dass Sie nicht genug Kontrolle haben.


Prost dafür. Ja, da versuche ich es zu pushen.
Eoin Campbell

Zumal EF die Technologie ist, auf die sich M $ bewegt. Und Linq macht das Leben der Entwickler so viel einfacher.
SoylentGray

Das ist so ziemlich der Weg, den StackOverflow erfolgreich beschritten hat, nicht wahr? Linq-To-SQL für all die gewöhnlichen Dinge und die benutzerdefinierten Dinge, aus denen die Dapper-Bibliothek für die benötigten Bits wurde.
Carson63000

5

Es ist nur dann eine gute Idee, wenn Sie sicher sein können, dass Sie mindestens so viel Zeit und Mühe sparen, indem Sie Ihren eigenen Code schreiben, wie für die Generierung dieses Codes erforderlich ist. Abhängig von der Situation kann sich dies auch auf Ihren Zeitplan auswirken, und Sie müssen dies ebenfalls berücksichtigen. Sie müssen auch die langfristige Wartung in die Gleichung einbeziehen. Wenn Sie Ihr eigenes ORM rollen, müssen Sie es für immer beibehalten (oder zumindest so lange, wie Sie es verwenden).

Unterm Strich ist , dass es kann sinnvoll sein, unter den richtigen Bedingungen. Diese Bedingungen umfassen im Allgemeinen:

  1. Das Projekt, an dem Sie arbeiten, ist recht umfangreich, sodass sich die Kosten über einen großen Nutzungsumfang amortisieren.
  2. Ihre Datennutzung ist so ungewöhnlich, dass vorhandene Bibliotheken (und solche) für Ihre Zwecke nur schlecht funktionieren.

Auf die Gefahr, das Offensichtliche auszudrücken, sind diese beiden Aspekte umgekehrt verwandt. Wenn Sie an einem wirklich gigantischen Projekt arbeiten, können sich selbst kleine Einsparungen bei jeder einzelnen Verwendung auf genug belaufen, um die Entwicklung zu rechtfertigen. Umgekehrt, wenn Ihre Bedürfnisse wirklich ungewöhnlich sind und Sie bei jedem Einsatz viel gewinnen, kann die Arbeit auch bei einem relativ kleinen Projekt gerechtfertigt sein.

Zumindest aufgrund Ihrer Beschreibung trifft dies jedoch in Ihrem Fall nicht wirklich zu. Vielleicht hat sich einer (oder sogar beide) auf die frühere Verwendung von EF durch Ihren Kollegen beworben, oder vielleicht hat er nur Vorurteile. Ich glaube, Sie haben uns nicht genug Informationen gegeben, um überhaupt zu erraten, welche (obwohl fairerweise, sollte ich hinzufügen, dass ich Ich schätze, das liegt daran, dass er dir nicht genug erzählt hat, um es zu erraten.

Wenn ich für diese Situation verantwortlich wäre, müssten Sie und Ihre Mitarbeiter jeweils eine Art Positionspapier verfassen - eine Liste der Stärken und Schwächen, die Sie bei jedem Ansatz sehen, zusammen mit echten Beweisen, die jede Behauptung / Behauptung stützen /wie auch immer. Das gesamte Team würde dann jedes Papier kritisieren (dh müssten). Der wichtigste Punkt in ihrer Kritik wäre, jeden Punkt auf zwei Skalen zu bewerten:

  1. das Ausmaß, in dem der Punkt zutreffend erscheint, durch Fakten usw. gestützt wird, und
  2. Inwieweit scheint der Punkt auf das vorliegende Projekt zuzutreffen?

Dann würde ich die Papiere und die Kritiken auswerten, um eine Entscheidung zu treffen (obwohl es völlig ehrlich ist, könnte es schwierig sein zu sagen, wie oft ich sie zur Entscheidungsfindung benutzte und wie oft ich sie zur Begründung einer Entscheidung benutzte Ich hatte es schon gemacht - ich weiß, ich sollte das wahrscheinlich nicht zugeben, aber die Realität ist, dass ich auch ein Mensch bin ...)

Bearbeiten:

Wenn ich besonders böse (oder "lehrreich" sein wollte - in diesem Fall ist der Unterschied kaum zu erkennen), würde jeder von Ihnen versuchen, eine Schätzung des Gesamtentwicklungsaufwands sowohl unter Verwendung eines vorhandenen ORM / DAL als auch bei der Entwicklung zu erstellen dein eigenes. Obwohl es nur eine Vermutung ist, ist meine unmittelbare Vermutung, dass die meisten Leute mit großen Plänen, ihre eigenen einzureichen, sich nicht die Mühe machen würden, ihre Schätzungen abzugeben - als sie eine Schätzung des Gesamtaufwands vorlegten, die sogar aus der Ferne abgeschlossen war (und realistisch), würden sie erkennen, dass es keine Möglichkeit gibt, mit dem vorhandenen Code mithalten zu können. Zur gleichen Zeit, es '

Edit 2: (Art auf @ CmdKey's Vorschlag): Obwohl nicht explizit erwähnt, gehe ich davon aus, dass eine Schätzung implizit eine Risikobewertung beinhaltet. Insbesondere sollte eine Schätzung der Zeit normalerweise Zahlen im PERT-Stil enthalten:

  1. Die bestmögliche Schätzung der schnellsten, die erreicht werden konnte, wenn alles richtig lief.
  2. Die "normale" Schätzung - wie lange Sie damit rechnen.
  3. Die Worst-Case-Schätzung der längsten Zeit, die es dauern könnte, wenn alles schief gehen würde.

Natürlich sollten die Best- und Worst-Case-Schätzungen normalerweise keine direkten göttlichen Eingriffe enthalten, sondern fast alles andere.


Danke für diesen Jerry. (Diese Antwort braucht mehr Upvotes :-))
Eoin Campbell

@ Jerry ausgezeichnete Punkt über die Kosten, am Ende ist es, was die Verwaltung kümmert, aber Sie müssen ein Maß für das Risiko in Ihre "pädagogische" Anfrage aufnehmen. Wenn Sie die mit einem Projekt verbundenen Risiken nicht einschätzen, sind Projekte mit dem niedrigsten Gebot normalerweise teurer als andere Optionen.
CdMnky

@ CdMnky: Guter Punkt. Entsprechend bearbeiten.
Jerry Coffin

3

Normalerweise ist es keine gute Idee, das Rad neu zu erfinden, und dies ist normalerweise ein Indiz für technische Ignoranz ("Ich weiß nichts anderes und möchte nicht lernen") oder Arroganz ("X ist dumm, das kann ich schreibe mein eigenes Werkzeug in zwei Wochen! "); Es gibt ausgereifte Tools, die Dinge viel besser können als das, was ein durchschnittlicher Entwickler in ein paar Wochen zusammen hacken kann.

Das heißt, es gibt Zeiten, in denen Sie eine Legacy-Anwendung nicht zuverlässig an eine vorhandene Lösung anpassen können (egal wie flexibel sie ist), ohne viel Arbeit zu haben. In einem Fall wie diesem ist es keine "gute" Idee, sondern eine bessere Idee als die Alternativen (dh belassen Sie sie wie sie ist oder schreiben Sie die Hälfte neu, um die Ebene eines Drittanbieters verwenden zu können), sodass Sie keine andere Wahl haben.


3

Ich war an einem Projekt beteiligt, bei dem die vorhandenen Java ORM-Tools aufgrund einer "kritischen" Funktion, die in Hibernate nicht vorhanden war, abgelehnt wurden, ihre eigenen zu schreiben. Dies war ein Fehler von mehreren Millionen Dollar, und die Kosten steigen täglich. Sie haben immer noch keine vollständige Unterstützung für Objektbeziehungen. Zusätzlich zu der Zeit, die für die Erstellung und Pflege des Frameworks aufgewendet wird, verbringen sie Stunden damit, Code zu schreiben, der mit Hibernate in wenigen Minuten geschrieben werden kann oder in vielen Fällen gar nicht geschrieben werden muss.

Die bestehenden Rahmenbedingungen sind das Ergebnis jahrelanger Bemühungen. Es ist absurd naiv, sich vorzustellen, dass ein einzelnes Team in ein paar Mannwochen irgendwohin kommen könnte.


1

Code, den Sie schreiben müssen, ist Code, den Sie pflegen müssen. Die Zeit , die ORM - Code beibehalten wird Zeit damit verbracht nicht die App zu halten. Wenn das ORM Ihnen keinen strategischen Vorteil verschafft, wird es kein Geld für das Geschäft generieren. Es ist also ein reiner Overhead. Würde Ihr Unternehmen lieber Geld für Gemeinkosten ausgeben oder ein geldverdienendes Produkt verbessern? Wenn dies für eine interne App ist, ist dies möglicherweise kein Problem, aber Sie erhöhen immer noch die Menge an Code, der geschrieben, getestet und dokumentiert werden muss.


0

Ich würde sagen, die Einführung eines eigenen ORM ist eine SCHLECHTE Idee - es sei denn, Sie haben einen sehr, sehr guten Grund dafür (übrigens, die von Ihnen genannten sind nicht gut genug :)

Ich habe einmal den Fehler gemacht, dass andere mich davon überzeugt haben, ORM nicht zu verwenden, und ich kann Ihnen sagen, dass das Schreiben der gesamten DAL uns wirklich verlangsamt hat und wir statt der Implementierung von Funktionen, die für das Geschäft von Bedeutung waren, Zeit mit DAL verbracht haben (es ist viel mehr Arbeit) als es aussieht).

Der neue EF scheint ziemlich gut zu sein, aber wenn Sie mehr Kontrolle wünschen, hätte ich mir Mikro-ORMs angesehen, wie: Drapper http://code.google.com/p/dapper-dot-net/ oder PetaPOCO http : //www.toptensoftware.com/petapoco/

Sie können auch mischen und anpassen - verwenden Sie EF für einen Großteil des Materials und Drapper für eine Feinabstimmung.

Jedenfalls ist das nur meine 2c;)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.