Plusieurs DbContexts en N-l'Application de la couche
Je suis de créer mon premier N de la couche application MVC et j'ai couru dans un bloc de route avec la gestion de plusieurs DbContexts
avec ma base de données à la première approche.
J'ai les couches suivantes
Presentation
Service (WCF)
Business
Data Access
Je ne veux pas d'une entité de référence de cadre dans mon service de couche, mais je ne vois pas comment créer une Interface ou quelque chose pour gérer les deux contextes. J'ai de travailler avec un seul contexte warpped dans un IDatabaseFactory mais je n'arrive pas à trouver une approche pour gérer les deux.
Ci-dessous est mon UnitOfWork
qui est créé dans mon Service ctor mais de toute façon je la regarde je suis encore lié à la SiteModelContainer
, alors qu'en fait, j'ai un autre contexte.
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();
}
}
OriginalL'auteur MisterIsaak | 2011-07-11
Vous devez vous connecter pour publier un commentaire.
De donner à votre Usine et UnitOfWork un paramètre de type générique peut être une solution:
La
IDatabaseFactory
etIUnitWork
interfaces devraient également être générique alors.Vous pouvez ensuite créer des unités d'Œuvres de différents contextes:
Edit:
Pour se débarrasser de la dépendance sur l'EF dans vos classes de service vous pouvez essayer quelque chose comme cela. Le service ne connaît que ces trois interfaces:
Voici spécial EF-implémentations spécifiques:
Votre service obtenir un
IUnitOfWorkFactory
injecté:Lorsque le service est créé le béton instance de l'usine est injectée:
Garder à l'esprit que le travail sera dans le résumé du référentiel et la mise en oeuvre. Dès que vous n'avez pas le contexte EF plus dans votre classe de service que vous avez à imiter un grand nombre de méthodes dans le repo de l'interface de l'appui de tout le nécessaire de scénarios pour manipuler les données.
UnitOfWork
ouDatabaseFactory
dans mon service de cette façon nécessite toujours une référence à entity framework que j'essaie d'éviter pour la séparation des préoccupations. Je ne veux pas que mon service dépend de l'EF, mais je peut finir par casser cette règle, je suppose.J'ai essayé une proposition visant à supprimer la dépendance de votre service de EF. Je pense que c'est possible, mais j'ai changé un peu, surtout remplacé le
DatabaseFactory
par unUnitOfWorkFactory
(à la fois de l'interface et la mise en œuvre), voir mon Edit...OriginalL'auteur Slauma
Vous pouvez créer un wrapper qui est générique référentiel à travers DbContexts (et utilise ObjectContext sous-jacent).
Voici un exemple que j'ai utilisé dans le passé (qui dissocie également votre code de toute dépendance directe sur Entity Framework).
OriginalL'auteur Jeff