2011-08-05 27 views
7

Hãy để tôi nói, tôi đã đi đến kết luận (sau nhiều lần dùng thử) mà Kho lưu trữ & Đơn vị công việc khi sử dụng Khung thực thể chỉ là sai, sai, sai và this says why khá tốt.Truy vấn có thể tái sử dụng trong khung thực thể KHÔNG có kho lưu trữ. Làm sao?

Nhưng tôi thực sự ghét những truy vấn được nhúng đó. Câu hỏi là, nơi tôi có thể đặt chúng thay vào đó nếu tôi chống lại một kho lưu trữ, vv? (chỉ có câu trả lời sạch sẽ, ví dụ được đánh giá cao).

Tôi chỉ nuked hai dự án chứa kho của tôi, đơn vị công việc và giao diện với hàng trăm của tệp vì không hoàn trả được khoản hoàn vốn. Tôi nghĩ rất nhiều người, kể cả bản thân tôi, vừa mới nhảy vào ban nhạc Repository vì đó là những gì mọi người khác đang làm nhưng nhìn lại, tôi nghĩ nó thực sự là một chuyến đi đến đâu cả.

/thở dài

Richard

Trả lời

3

Nơi nào bạn mong đợi để đưa họ? Bạn chỉ có vài lựa chọn:

  1. Hãy để họ được nơi họ đang có và sử dụng phương pháp mở rộng thông thường, query views, quan điểm cơ sở dữ liệu ánh xạ hoặc tùy chỉnh defining queries để xác định phần tái sử dụng
  2. Expose mỗi truy vấn duy nhất như phương pháp trên một số lớp riêng biệt. Phương thức không được hiển thị IQueryable và không được chấp nhận Expression vì tham số logic = toàn bộ truy vấn phải được bao bọc trong phương thức. Nhưng điều này sẽ làm cho lớp học của bạn bao gồm các phương pháp liên quan giống như kho lưu trữ (chỉ có một trong đó có thể được chế giễu hoặc giả). Việc triển khai này gần với việc triển khai được sử dụng với các thủ tục được lưu trữ.
  3. Bạn sẽ làm tương tự như trong phương pháp trước nhưng thay vì đặt truy vấn trong lớp riêng biệt, bạn sẽ đặt chúng làm phương thức tĩnh cho thực thể trực tiếp. Điều này là tồi tệ hơn thử nghiệm bởi vì phương pháp tĩnh không thể được thay thế bằng cách chế nhạo (nó đòi hỏi khuôn khổ thử nghiệm phức tạp hơn). Đây là một phần của active record pattern trong đó mỗi pháp nhân chịu trách nhiệm về việc tải và lưu vào cơ sở dữ liệu.

Ví dụ về phương pháp mở rộng thông thường:

public static IQueryable<TEntity> GetByName(this IQueryalbe<TEntity> query, string name) 
    where TEntity : IEntityWithName 
{ 
    return query.Where(e => e.Name == name); 
} 

Ví dụ về phương pháp lớp tùy chỉnh phơi bày:

public class QueryProvider 
{ 
    public QueryProvider() {} 

    public IEnumerable<TEntity> GetByName(IYourContext context, string name) 
     where TEntity : IEntityWithName 
    { 
     return context.CreateObjectSet<TEntity>().Where(e => e.Name == name).ToList(); 
    } 
} 
+0

Kiểm tra thực thể & khung kiểm nghiệm gần giống với oxymoron nhưng tôi biết ý bạn là gì. Ngay sau khi mọi thứ trở nên phức tạp, các cách tiếp cận ở trên rơi ra ngoài nhưng giống như bạn nói, còn gì khác nữa?Gói tất cả trong một kho lưu trữ chỉ là chuyển đổ lỗi cho một nơi khác. – Richard

2

Build Reusable, Testable Queries Part 1

Đây là một bài viết trên blog, tôi đã viết về việc xây dựng các truy vấn tái sử dụng. Sử dụng các phương pháp mở rộng cho phép bạn xây dựng các truy vấn có thể tổng hợp.

sử dụng mẫu như mẫu đặc điểm có thể giúp bạn tạo các truy vấn có thể được sử dụng lại hoặc lưu (được tuần tự hóa). Hơn nữa nếu bạn có một hệ thống nhập kép, bạn có thể thực thi cùng một cá thể truy vấn trên hai cơ sở dữ liệu khác nhau.

ví dụ sau không sử dụng EF nhưng thay thế IEnumerable bằng ngữ cảnh EF và bạn nhận được những gì bạn đang tìm kiếm. các tham số được truyền vào thông qua hàm tạo.

public class PartialMatchQuery : IModelQuery<string, IEnumerable<string>> 
{ 
    private readonly string partial; 

    public PartialMatchQuery(string partialString) 
    { 
     partial = partialString; 
    } 

    public IEnumerable<string> Execute(IEnumerable<string> model) 
    { 
     return model.Where(s => s.ToLower().Contains(partial)); 
    } 
} 
Các vấn đề liên quan