1) Was tun Sie, wenn Sie ORMs ausschalten möchten? Ihre Anwendung enthält einen bestimmten ORM-Code, wenn Sie ihn nicht in einem Repository enthalten.
Ich war noch nicht in einer Position, in der das Unternehmen plötzlich beschlossen hat, die Datenzugriffstechnologie zu wechseln. In diesem Fall sind einige Arbeiten erforderlich. Ich tendiere dazu, Datenzugriffsoperationen über Schnittstellen zu abstrahieren. Repository ist eine Möglichkeit, dies zu lösen.
Ich hätte dann eine andere Assembly für die konkrete Implementierung meiner Datenzugriffsebene. Zum Beispiel könnte ich haben:
Company.Product.Data
und Company.Product.Data.EntityFramework
Baugruppen. Die erste Assembly würde nur für Schnittstellen verwendet, während eine andere eine konkrete Implementierung der Datenzugriffslogik von Entity Framework wäre.
2) Ist das Repository-Muster noch gültig, wenn Sie keinen ORM verwenden und ADO.net für den Datenzugriff und das Auffüllen von Objektdaten selbst verwenden?
Ich denke, es liegt an Ihnen, zu entscheiden, welches Muster gültig ist oder nicht. Ich habe ein Repository-Muster in der Präsentationsebene verwendet. Eine Sache, an die man denken sollte, ist, dass die Leute gerne Verantwortung in die Repositories werfen. Bevor Sie es wissen, wird Ihre Repository-Klasse tanzen, singen und alle möglichen Dinge tun. Sie möchten dies vermeiden.
Ich habe eine Repository-Klasse gesehen, die zu Beginn die Zuständigkeiten GetAll, GetById, Update und Delete hatte, was in Ordnung ist. Zu dem Zeitpunkt, als das Projekt abgeschlossen war, verfügte dieselbe Klasse über Dutzende von Methoden (Verantwortlichkeiten), die niemals hätten da sein dürfen. Zum Beispiel GetByForename, GetBySurname, UpdateWithExclusions und alle möglichen verrückten Sachen.
Hier kommen Abfragen und Befehle ins Spiel.
3) Wenn Sie ein ORM verwenden, aber nicht das Repository-Muster, werden häufig verwendete Abfragen gespeichert. Wäre es sinnvoll, jede Abfrage als Klasse darzustellen und eine Art Abfragefactory zum Erstellen von Instanzen zu haben?
Ich halte es für eine sehr gute Idee, Abfragen und Befehle anstelle von Repositorys zu verwenden. Ich mache folgendes:
Schnittstelle für eine Abfrage definieren. Dies wird Ihnen beim Unit-Test helfen. Z.Bpublic interface IGetProductsByCategoryQuery { ... }
Definieren Sie eine konkrete Implementierung für eine Abfrage. Sie können diese über ein IoC-Framework Ihrer Wahl einspeisen. Z.Bpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Anstatt das Repository mit Dutzenden von Verantwortlichkeiten zu verschmutzen, gruppiere ich meine Abfragen einfach in Namespaces. Beispielsweise kann eine Schnittstelle für die obige Abfrage in: Company.SolutionName.Products.Queries
und die Implementierung in lebenCompany.SolutionName.Products.Queries.Implementation
Wenn es um das Aktualisieren oder Entfernen von Daten geht, verwende ich das Befehlsmuster auf die gleiche Weise.
Einige mögen anderer Meinung sein und sagen, dass Sie Dutzende von Klassen und Namespaces haben werden, bevor das Projekt abgeschlossen ist. Ja du wirst. In meinen Augen ist es eine gute Sache, wenn Sie die Lösung in der IDE Ihrer Wahl durchsuchen und sofort sehen können, welche Art von Verantwortlichkeiten eine bestimmte Komponente hat. Wenn Sie sich stattdessen für die Verwendung eines Repository-Musters entschieden haben, müssen Sie in jeder Repository-Klasse nachsehen, um die Verantwortlichkeiten herauszufinden.