2013-04-12 9 views
6

Ho cercato di implementare questi modelli in un progetto su cui sto lavorando. L'UoW ha il contesto del database e quindi istanzia un numero di repository con quel contesto. La mia domanda riguarda lo smaltimento del contesto. Molti articoli che ho visto hanno il repository come IDisposable e quindi dispongono del contesto. Questo mi ha confuso senza fine, mi manca qualcosa o (nel mio caso) dovrebbe essere solo l'UoW che dispone del contesto? Inoltre, dovrei implementare IDisposable sui miei repository?Unità di lavoro, repository e IDisposable

Grazie

Chris

risposta

9

Sì, l'unità di lavoro dovrebbe attuare IDisposable e smaltire il contesto, non i repository.

Ecco un esempio:

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; 
    } 
}