Mehrere DbContexts in N-Tier-Anwendung
Ich bin momentan dabei, meine erste N-Tier, MVC-Anwendung und ich habe laufen in eine Straßensperre mit, wie zu verwalten mehrerer DbContexts
mit meiner database first Ansatz.
Habe ich die folgenden Schichten
Presentation
Service (WCF)
Business
Data Access
Ich nicht wollen, dass eine entity framework Referenz in meinem service-layer, aber ich sehe nicht, wie eine Schnittstelle zu erstellen, oder etwas, das verwalten von zwei Kontexten. Ich habe es die Arbeit mit einem einzigen Kontext warpped in einem IDatabaseFactory aber ich kann nicht scheinen zu finden, ein Ansatz zur Verwaltung von zwei.
Unten ist mein UnitOfWork
erstellt wird in meinem Dienst ctor, aber jede Weise, die ich es anschaue ich bin immer noch an der SiteModelContainer
, wenn in der Tat habe ich einen anderen Zusammenhang.
public class UnitOfWork : IUnitOfWork
{
private SiteModelContainer _context;
private readonly IDatabaseFactory _databaseFactory;
protected SiteModelContainer SiteContext
{
get { return _context ?? (_context = _databaseFactory.Get()); }
}
public UnitOfWork(IDatabaseFactory factory)
{
_databaseFactory = factory;
_context = _databaseFactory.Get();
}
//More code
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private SiteModelContainer _dataContext;
public SiteModelContainer Get()
{
return _dataContext ?? (_dataContext = new SiteModelContainer());
}
protected override void DisposeCore()
{
if (_dataContext != null)
_dataContext.Dispose();
}
}
- "Ich habe es die Arbeit mit einem einzigen Kontext warpped in einem IDatabaseFactory" ich fühle deinen Schmerz; viel von meinem code scheint zu sein in einer Zeit und/oder Raum zu verziehen, zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Indem Sie Ihre Fabrik und UnitOfWork einen generischen Typ-parameter könnte eine Lösung sein:
Den
IDatabaseFactory
undIUnitWork
Schnittstellen müssten auch die generische dann.Dann könnten Sie erstellen, die Einheit von Arbeiten, die für verschiedene Kontexte:
Edit:
Loszuwerden, die Abhängigkeit von EF in Ihre service-Klassen, die Sie könnten versuchen, so etwas wie dieses. Der service kennt nur diese drei Schnittstellen:
Hier sind die speziellen EF-spezifische Implementierungen:
Ihren service bekommen würde
IUnitOfWorkFactory
injiziert:Wenn der Dienst erstellt wird, die konkrete Instanz der factory injiziert wird:
Beachten Sie, dass die harte Arbeit wird in die abstract-repository und it-Umsetzung. So bald, wie Sie nicht haben die EF-Kontext mehr in Ihrer Klasse Sie haben, zu imitieren, eine Menge von Methoden, die in der repo-Schnittstelle unterstützen alle notwendigen Szenarien zur Manipulation der Daten.
UnitOfWork
oderDatabaseFactory
in meinem Dienst dieser Art und Weise noch einen Verweis auf entity framework, die ich versuche zu vermeiden, für die Trennung von Bedenken. Ich will nicht, dass mein Dienst abhängig vom EF aber ich kann am Ende brechen dieser Regel, denke ich.DatabaseFactory
durch eineUnitOfWorkFactory
(sowohl die Schnittstelle und die Implementierung), siehe mein Edit...Konnten Sie erstellen einen wrapper, der ist generic repository über DbContexts (und nutzt die zugrunde liegenden ObjectContext um dies zu unterstützen).
Hier ist ein Beispiel, das ich in der Vergangenheit verwendet habe (die auch entkoppelt Ihren code ohne direkte Abhängigkeit von Entity Framework).