Beim Versuch, eine Datenzugriffsschicht für ein neues Projekt zu erstellen, stieß ich auf das, was ich mir nur als OOP / Design / Generics-Problem vorstellen kann (mit EF 4.3 auf die Datenbank zugreifen).
Hauptsächlich wollte ich mit dieser Datenschicht zwei Dinge erreichen:
Aus irgendeinem Grund kann ich meine Lösung nicht kompilieren, ohne EntityFramework auf der Serviceebene zu referenzieren. Nach was ich suche, ist ein Weg, das zu beheben. Folgendes habe ich:
%Vor%Ich habe eine Service-Schicht zwischen Datenzugriff und der Anwendung (Windows Forms). Da ich ein generisches Repository habe, schien es eine gute und logische Idee zu sein, generische Dienste zu haben. Am Ende sehr ähnlich der Repository-Struktur:
%Vor%Bei dieser Konfiguration besteht die einzige Möglichkeit zum Kompilieren darin, Entity Framework auf dem Service-Layer-Projekt zu referenzieren. Wie kann ich vermeiden, dass dort auf Entity Framework verwiesen wird?
An diesem Punkt bin ich bereit, alles auszuwerfen und alles neu zu erstellen, aber das ist die einzige Möglichkeit, die es funktioniert, wenn ich es brauche (DbContext teilt Verbindungszeichenfolgen, generisches Repository, um die Replikation von Code zu vermeiden).
Schätze jede Hilfe. Danke.
- Bearbeiten - Einschließlich einiger zusätzlicher Schritte, die ich 3 Stunden nach der Veröffentlichung der Frage unternommen habe -
Um das herauszufinden, habe ich angefangen, ein Beispielprojekt mit dem gleichen Code oben zu erstellen sowie eine Implementierung, um die Ergebnisse des ursprünglichen Projekts so gut wie möglich nachzuahmen.
Ich habe das Domänenklassenprojekt, das gesamte Basisdatenschichtprojekt und dann das Kontextprojekt erstellt. Ich habe bemerkt, dass ich auf Entity Framework im Kontextprojekt verweisen muss, obwohl die Kontextklasse nicht direkt von DbContext abgeleitet wird. Stattdessen stammt es von einer abstrakten Klasse, die von DbContext abgeleitet ist. Dies ist jedoch in Ordnung, da mein Kontext DbSets und jede andere mit DbContext verbundene Implementierung hat.
Als nächstes folgt das Repository-Projekt. Muss alle anderen drei referenzieren (Domäne, Basisdatenschicht und Kontext). Mein Repository hat keinen Code. Alle Funktionen liegen auf dem Vorfahren. Ich versuche das Repository-Projekt zu kompilieren und VS verlangt von mir, Entity Framework zu referenzieren. Ich frage mich, ob es wirklich nur darum geht, Bibliotheken einzubetten. Wenn dies bestätigt wird, wird es eine Überraschung sein. Die Entity Framework-Bibliothek ist in der Ausgabe der anderen Projekte enthalten. Warum sollte ich auch hier darauf verweisen? Was macht VS dafür?
Zu Testzwecken habe ich die Referenz hinzugefügt. Immerhin bin ich in der Datenschicht. Ich kann damit leben. Weiter zur Service-Schicht. Der Einfachheit halber lege ich alle Serviceklassen in dasselbe Projekt.
Ein möglicher Fehler ist, dass eine der Einschränkungen für die abstrakten Service-Klassen die Repository-Schnittstelle ist. Dazu muss ich einen Verweis auf die Basisdatenebene auf meiner Serviceebene hinzufügen. Vielleicht kann ich schon hier etwas tun, das mir erlaubt, nur die Repository-Referenz zu verwenden. Ich habe keine andere Wahl, als auf die Basisdatenebene zu verweisen.
Schließlich wird mein konkreter Dienst erstellt, und VS gibt mir die folgende Fehlermeldung: Der Typ 'System.Data.Entity.DbContext' ist in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen der Assembly 'EntityFramework, Version = 4.3.1.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' einen Verweis hinzufügen.
Am Ende ist der einzige Weg, weiterzumachen, Entity Framework auf der Service-Schicht zu referenzieren. Und irgendwann, wenn ich die Windows Forms App erstelle, muss ich auch auf Entity Framework verweisen.
Was soll ich tun, um diese Referenzen zu vermeiden? Welche Verbesserungen kann ich an dieser Struktur vornehmen?
Was ich weiß ist, dass meine App sicherlich nicht wissen muss, dass Entity Framework irgendwo auf den anderen Ebenen beteiligt ist. Auch nicht die Service-Ebene. Dienste werden nur Repositories verwenden. Repositories können sogar gefälschte Daten für Tests bereitstellen.
Falls jemand interessiert ist, habe ich das Projekt hochgeladen, das ich während des Schreibens erstellt habe. Es ist eine 1,17 MB zip-Datei mit keinerlei Binärdateien (außer der Entity Framework 4.3.1 dll, die ich über Nuget bekommen habe). Link: Ссылка .
Nochmals vielen Dank für Ihre Hilfe.
Deklarieren Sie eine Schnittstelle, anstatt in Ihrer BaseContext
das Abstract BusinessLogicLayer
zu haben. Dann implementieren Sie es in Ihrer Datenzugriffsschicht.
Dann in der Datenzugriffsebene
%Vor%Sie können DI / Ioc verwenden, um den Kontext und das Repository den Services zu injizieren, anstatt den Kontext im Repository zu instanziieren.
Durch diese Entkopplung wird die Referenzierung der EF-Assembly in Ihrer Business-Logik-Schicht überflüssig. Beachten Sie jedoch, dass Ihre Domänen-Entitäten nicht vollständig unabhängig von EF sind. Zum Beispiel Navigations-Eigenschaften, Relationen reparieren nicht funktioniert außerhalb EF-Kontext. In gewisser Weise versteckst du also eine Abhängigkeit !!
Tags und Links .net c# entity-framework generics oop