1

我一直在做很多關於存儲庫模式(Linq2SQL或EF)的閱讀。我見過一些存儲庫,其中包含一些特定的查詢,如FindUserByName,我將where表達式傳遞給存儲庫。存儲庫中的具體查詢

另一方面,我看到一些只有「Save,Update和GetAll」的倉庫和GetAll返回一個IQueryable。而且,這個IQueryable在服務層被過濾。

因此,在您看來,將特定查詢傳遞給存儲庫還是儘可能簡化並讓所有過濾器在服務中發生是好事?

謝謝!

回答

2

我的建議是創建一個GenericRepository<T>,它具有核心基本方法(Find,Save,Delete等)。

例子:

public abstract class GenericRepository<T> : IRepository<T> where T : class 
{ 
    public T FindSingle(Expression<Func<T,bool>> predicate) { .. }; 
    public IQueryable<T> Find() { .. }; 
    public void Delete(T entity) { .. };  
} 

然後創建一個從仿製一個繼承特定庫,創建專門的方法。

例子:

public class EmployeeRepository : GenericRepository<Employee>, IRepository<Employee> 
{ 
    public Employee FindByLastName(string lastName) 
    { 
     return FindSingle(emp => emp.LastName == lastName); 
    } 

    public ICollection<Employee> FindAllManagers() 
    { 
     return Find().Where(emp => emp.Type == "Manager").ToList(); 
    } 

    // other methods... 
} 

意味着你不能在你的倉庫重複共同代碼。

是的,另一種選擇是有服務的GenericRepository<T>工作。這意味着服務(本質上)是專門的存儲庫。

所以這只是一個偏好問題,如果你想要一個服務層或專門的存儲庫。

+0

嗯......我會對你說的一些想法!謝謝!! – AndreMiranda