2013-10-31 100 views
3

我正在爲我的應用程序開發通用存儲庫,我在這裏有一些疑問。通用存儲庫問題

這是一些我對通用的存儲庫中的代碼:

public interface IEntityRepository<T> where T : class 
{ 
    void Add(T entity); 
    T GetById(int id); 
    IEnumerable<T> Get(Expression<Func<T, bool>> predicate); 
    IEnumerable<T> GetAll(); 
} 

public class EntityRepository<T> : IDisposable, IEntityRepository<T> where T : class 
{ 
    protected DbSet<T> DbSet; 
    protected DbContext Context; 

    public EntityRepository(DbContext dataContext) 
    { 
     DbSet = dataContext.Set<T>(); 
     Context = dataContext; 
    } 

    public void Add(T entity) 
    { 
     DbSet.Add(entity); 
    } 

    public IEnumerable<T> Get(Expression<Func<T, bool>> predicate) 
    { 
     return DbSet.Where(predicate); 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return DbSet; 
    } 

    public T GetById(int id) 
    { 
     return DbSet.Find(id); 
    } 

    // IDisposable 
    public void Dispose() 
    { 
     if (Context != null) 
     { 
      Context.Dispose(); 
     } 
     GC.SuppressFinalize(this); 
    } 
} 

什麼我遇到困難是這樣的:

1 - 我應該返回的IEnumerable從倉庫層服務層而不是IQueryable?我已經閱讀了關於這個主題的一些關於網絡的文章,但是找不到這個問題的一個明確的或合理的明確的答案。通過返回IEnumerable,所有後續查詢將在本地完成?

2 - 顯然需要的一件事是能夠檢索分頁數據。我不想獲得10萬條記錄只是爲了顯示50.我的問題是,如果這個「邏輯」應該在存儲庫或服務,即服務獲取所有數據,然後跳過/需要但它需要或存儲庫已經只返回服務需要的數據?還是應該將這些類型的方法放在繼承通用類的特定存儲庫中?

在此先感謝

+0

我認爲回購應該儘可能愚蠢,只是一個DbSet的包裝。也許這麼愚蠢,你開始問自己,爲什麼我首先需要他們?這確實是[正在進行的辯論](http://stackoverflow.com/a/5626884/861716)。順便說一下,在回購之外擁有DbContext是一個不錯的選擇。 –

回答

1

永遠不會返回IQueryable的,因爲它是一個ORM 失敗使用資源庫的精神的實現細節:告訴回購你從它想要的東西,不如何。 IQueryable意味着你自己構建查詢的一部分,因此你告訴它如何

通用存儲庫大多是反模式,因爲它使用ORM entities instead of Domain entities。即使使用DOmain實體,它也只能用作Domain Repositories,因爲您需要用於查詢目的的不同接口定義。根據需要定義每個存儲庫接口。

關於分頁,只需將'skip'和'take'參數傳遞給repo方法。即使不使用ORM,它也會起作用,回購將根據其使用的DAO執行分頁分貝。爲了您自己的利益,請嘗試使用CQRS思維模式,這將使您的DDD生活變得更加輕鬆。