2012-02-14 27 views
8

Tôi thường thấy các mẫu ví dụ kho mà trông như thế này:Repository mẫu - quá nhiều phương pháp

public interface IRepository<T> 
{ 
    T GetById(int id); 
    IEnumerable<T> GetAllByName(string name); 
} 

Nhưng làm thế nào để bạn xử lý trường hợp bạn có thể cần phải thực hiện tìm kiếm phức tạp? Tôi không nghĩ rằng nó sẽ là một ý tưởng tốt để thêm nhiều phương pháp để giao diện đó sẽ làm cho nó kết thúc tìm kiếm như:

IEnumerable<T> GetAllByFirstName(string name); 
IEnumerable<T> GetAllByLastName(string name); 
IEnumerable<T> GetAllByFirstAndLastName(string name); 
IEnumerable<T> GetAllByAddress(string name); 
... 
... 
... 

Trả lời

6

Sử dụng Predicate Builder để tự động xây dựng có điều kiện thỏa

public interface IRepository<T> 
{ 
    T GetById(int id); 

    IEnumerable<T> GetAllBy(Expression<Func<T, bool>> predicate); 
} 

Sau đó xây dựng điều kiện

var predicate = PredicateBuilder.True<Customer>(); 
    if (!string.IsNullOrEmpty(FirstName)) 
    { 
     predicate = predicate.And(d => d.FirstName.Contains(FirstName)); 
    } 

    if (!string.IsNullOrEmpty(LastName)) 
    { 
     predicate = predicate.And(d => d.LastName.Contains(LastName)); 
    } 

    var products = productRepo.GetAllBy(predicate); 
.210

Tạo một lớp học để vượt qua các tiêu chí tìm kiếm

public class CustomerFilterCriteria 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string Address { get; set; } 

} 

public interface IRepository<T> 
{ 
    T GetById(int id); 
    IEnumerable<T> GetAllBy(CustomerFilterCriteria criteria); 
} 
+1

Điều gì nếu tôi không thể sử dụng các biểu thức? Ví dụ, nếu tôi phải sử dụng các thủ tục lưu trữ đằng sau kho lưu trữ? – Books

+0

@Ashley Xem câu trả lời đã chỉnh sửa – Eranga

+0

Có các tính năng này được tích hợp vào LINQ vì câu trả lời này đã được đăng không? –

0

Bạn có thể thêm một filtermodel và kiểm tra mà bộ lọc đã được lấp đầy như vậy:

IEnumerable<T> GetAllByFiilter(FilterModel filter); 


public class FilterModel { 
    public string Lastname {get;set;} 
    public string Firstname {get;set;} 
} 


public IEnumerable<T> GetAllByFilter(FilterModel filter) { 
    if(!string.IsNullOrWhiteSpace(filter.Lastname) { 
    //add restriction 
    } 
    // .. etc .. 
} 
0

các "có được phương pháp" có thể là một giao diện của riêng mình:

public interface IGetMethod<T> 
    { 
     IEnumerable<T> get(String name); 
    } 

    class GetByName<T> : IGetMethod<T> 
    { 
     IEnumerable<T> get(String name) 
     { 
      // ... 
     } 
    } 

    public interface IRepository<T> 
    { 

     IEnumerable<T> GetAllByMethod(IGetMethod<T> method, string name); 
    } 
2

Câu hỏi: Tại sao làm cho kho lưu trữ chung nếu bạn đang đi để được phơi bày các phương pháp cụ thể loại (hoặc làm tất cả các bạn r thực thể có FirstName, LastName, Address etc?).

Nếu tài nguyên dữ liệu cơ bản của bạn là cây biểu thức LINQ được bật, chữ ký chung cũng sẽ là chung chung, ví dụ:

IEnumerable<TEntity> Query(Expression<Func<TEntity, Boolean>> filter) 

Và nếu bạn muốn truy vấn của bạn sẽ được 'stackable', bạn có thể phơi bày một IQueryable

IQueryable<TEntity> Query(Expression<Func<TEntity, Boolean>> filter) 
1

Heres phương pháp tôi cung cấp trên mô hình kho của tôi,

public interface IRepository<T> : IDisposable 
    { 
     void Create(T entity); 

     void Delete(T entity); 

     void Update(T entity); 

     IQueryable<T> GetAll(); 

     T GetBy(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes); 
    } 

Cá nhân tôi nghĩ rằng nó tốt hơn để cho phép một truy vấn sau này như đôi khi bạn cần nó, tôi cũng thích có một getby chung chung. Sự kết hợp của điều này là tất cả các kho được đánh máy của tôi được cung cấp một cách chung chung mà không có cấu hình thực thể riêng lẻ nào.

đã đọc bài viết của tôi về nó ở đây http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html

0

có một kho lưu trữ chung

public interface IRepository<T> 
{ 
    T GetById(int id); 
    IEnumerable<T> GetAllBy(Expression<Func<T, bool>> predicate); 
} 

sau đó có kho cụ thể hơn

public interface IUserRepository : IRepository<T> 
    { 
     User GetByName(string name); 
    } 

cách mà kho chung của bạn xử lý tất cả những thứ CRUD và các kho lưu trữ thực tế của bạn bất cứ điều gì

Các vấn đề liên quan