2013-04-12 23 views
6

Şu an üzerinde çalıştığım bir projede bu kalıpları uygulamaya çalışıyorum. UoW, veritabanı içeriğine sahiptir ve daha sonra bu bağlamda bir dizi depoyu başlatır. Benim sorum, içeriği bertaraf etmekle ilgilidir. Gördüğüm pek çok makale, depoyu kimliğe uygun olarak kullanıyor ve daha sonra bağlamı bertaraf ediyorlar. Bu beni hiç şaşırtmadı, bir şeyi mi özledim yoksa (benim durumumda) sadece bağlamdan yoksun olan UoW olmalı mı? Ayrıca, depolarımda IDisposable uygulanmalı mıyım?İş Birimi, Depolar ve Tek Kullanımlık

Teşekkür

Chris

cevap

9

Evet, İş birimi IDisposable uygulamak ve bağlamı değil, depoları imha edilmelidir.

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

İşte bir örnek