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.
quelle
Antworten:
Beide Argumente gegen bestehende ORMs sind ungültig:
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.
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:
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.
quelle
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.
quelle
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:
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:
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:
Natürlich sollten die Best- und Worst-Case-Schätzungen normalerweise keine direkten göttlichen Eingriffe enthalten, sondern fast alles andere.
quelle
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.
quelle
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.
quelle
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.
quelle
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;)
quelle