2011-08-10 34 views
1

我有以下的通用存儲庫:處置語境

public class EFRepository<TEntity, TContext> : IRepository<TEntity, TContext>, IDisposable 
    where TEntity : class 
    where TContext : ObjectContext 
{ 

    protected TContext context; 

    public EFRepository(TContext context) 
    { 
     this.context = context; 
    } 

    //CRUD methods... 

    public void Dispose() 
    { 
     if (null != context) 
     { 
      context.Dispose(); 
     } 
    } 
} 

這是從業務層

public class UserBLL : BaseBLL<User> 
{ 

    EFRepository<User, MyEntities> userRepo = null; 

    public UserBLL() : base() 
    { 
     //Context is created in the consructor of the base class and passed to repository 
     userRepo = new EFRepository<User, MyEntities>(Context); 
    } 
} 

這裏一類是在基礎業務類:

public class BaseBLL <TEntity> 
     where TEntity : class 
    { 
     protected MyEntities Context { get; set; } 

     public BaseBLL() 
     { 
      this.Context = DataAccessHelper.Context; 
      this.Context.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly); 
     } 
    } 

在這個設計中,由於我在業務類構造函數中創建了一個存儲庫實例,而不是在使用子句,版本庫的dispose方法在默認情況下不會被調用。我的主要問題是如何確保上下文/存儲庫處置。

我知道我可以在每個方法內的using子句中創建存儲庫,而不是在構造函數中,但我想知道是否有更優雅的方法。

隨意就一般的設計發表評論。

+0

看看[這個答案](http://stackoverflow.com/questions/6987908/what-is-the-best-way-to-instantiate-and-dispose-dbcontext-in -mvc/6990244#6990244) – Eranga

回答

2

這是完全錯誤的。您在存儲庫之外創建上下文,因此存儲庫無法負責處理。儲存庫構建用於處置的圖層= BaseBLL必須是一次性的,上層必須在不再需要時正確處理它。

+0

好的,你會如何重新設計它?你會在倉庫中創建上下文而不是傳遞它嗎?你將如何確保妥善處置?你會在using子句中的業務層中創建一個存儲庫實例嗎? –

+0

我不會說*完全*錯,只是不合時宜。存儲庫可以知道足夠的內容來創建上下文,但是它可以將它與該上下文的創建結合起來,這與創建連接字符串等相關。我將使用Unity等IoC容器將上下文注入到存儲庫的構造器中。如果你通過容器完成所有這些工作,並且正確設置了生命週期,那麼你不必擔心處置。 – Kit