2016-09-28 1 views
1

Je la pièce suivante wrapper transaction de base de données écrite:séparatrice EF du BLL

public class ExampleWrapper : IDisposable 
    { 
     public DbContextTransaction Transaction { get; set; } 
     public DcatContext DatabaseContext { get; set; } 

     public ExampleWrapper() 
     { 
      DatabaseContext = new someContext(); 
      Transaction = DatabaseContext.Database.BeginTransaction(); 
     } 


     public void Dispose() 
     { 
      Transaction.Dispose();      
     } 


     public void Commit() 
     { 
      Transaction.Commit(); 

     } 

     public void RollBack() 
     { 
      Transaction.Rollback(); 
     } 
    } 

J'ai le code quelque chose de semblable à ce qui suit dans mon DAL:

public async Task<Object> Retrieve(string Id) 
     { 

      using (var context= new SomeContext()) 
      { 
       return Context.Object.Find(id); 
      } 
     } 

Je suis en train de garder la couche de gestion est distincte de toute dépendance Entity Framework et c'est la raison de la classe wrapper. Si je suis en train de faire une transaction de la BLL par exemple:

using(var wrapper = new ExampleWrapper()) 
{ 
    //make calls to the DAL 
     something.Retrieve(Id) 
} 

Ma question est que je suis deux fois la Dbcontext Initialisation (ici en créant une transaction, ainsi que dans le DAL). Y a-t-il une suggestion quelconque d'entre vous pour savoir comment je peux faire cela mieux? . PS: Utiliser simplement récupérer dans une transaction à titre d'exemple.

+0

Désolé ... Je suppose que je viens de mettre assez pour avoir l'idée. – kauschan

+0

Je vous suggère de regarder ceci: https://github.com/mehdime/DbContextScope –

+0

Dans la nomenclature plus actuelle, votre 'ExampleWrapper' est une * Unité de Travail * et' Retrieve' devrait être dans un * référentiel générique *. Maintenant, si vous recherchez cette combinaison, vous trouverez des exemples pour le faire correctement. –

Répondre

0

Vous pouvez utiliser l'injection de dépendances (par exemple Ninject) pour injecter le DbContext dans le wrapper . Vous pouvez ensuite définir la durée de vie des instances DBContext. S'il s'agit d'une application Web, vous pouvez définir la durée de vie de DbContext comme étant comprise dans la durée de la demande Web (InRequestScope), afin de disposer automatiquement de DbContext après la fin de la demande Web.

Vous n'avez plus besoin de créer le DbContext, puisque Ninject le crée pour vous et gère sa mise au rebut.