2013-04-12 3 views
6

Ich habe versucht, diese Muster in einem Projekt zu implementieren, an dem ich gerade arbeite. Die UoW hat den Datenbankkontext und instanziiert dann eine Anzahl von Repositories mit diesem Kontext. Meine Frage bezieht sich auf den Kontext. Viele Artikel, die ich gesehen habe, haben das Repository als IDisposable und sie verfügen über den Kontext. Das hat mich durcheinander gebracht, fehlt mir etwas oder (in meinem Fall) sollte es nur die UoW sein, die den Kontext verstellt? Soll ich IDisposable in meinen Repositories implementieren?Unit of Work, Repositories und IDisposable

Dank

Chris

Antwort

9

Ja, sollte die Einheit der Arbeits IDisposable implementieren und den Kontext verfügen, nicht die Repositories.

Hier ein Beispiel:

public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
} 

public class EntityFrameworkUnitOfWork<TContext> : IUnitOfWork 
    where TContext : DbContext, new() 
{ 
    public EntityFrameworkUnitOfWork() 
    { 
     this.DbContext = new TContext(); 
     ConfigureContext(this.DbContext); 
    } 

    protected virtual void ConfigureContext(TContext dbContext) 
    { 
     dbContext.Configuration.ProxyCreationEnabled = false; 
     dbContext.Configuration.LazyLoadingEnabled = false; 
     dbContext.Configuration.ValidateOnSaveEnabled = false; 
    } 

    protected TContext DbContext { get; private set; } 

    public void Commit() 
    { 
     this.DbContext.SaveChanges();   
    } 

    public void Dispose() 
    { 
     this.Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!disposing) 
     { 
      return; 
     } 

     if (this.DbContext == null) 
     { 
      return; 
     } 

     this.DbContext.Dispose(); 
     this.DbContext = null; 
    } 
}