2009-04-12 27 views
12

Tôi mới tham gia Mẫu lưu trữ và sau khi thực hiện rất nhiều lần đọc trên web, tôi có một sự hiểu biết sơ bộ về những gì đang diễn ra, nhưng dường như có một xung đột về ý tưởng.Mẫu lưu trữ - POCO hoặc IQueryable?

Một trong những cách mà IRepository sẽ trả về.

Tôi muốn kinh doanh CHỈ Pocos vì vậy tôi sẽ có một thực hiện IRepository cho mỗi gốc tổng hợp, như vậy:

public class OrangeRepository: IOrangeRepository 
{ 
    public Orange GetOrange(IOrangeCriteria criteria); 
} 

nơi IOrangeCriteria mất một số lập luận cụ thể để tìm kiếm một độc da cam.

Điều khác tôi có là một số dữ liệu back-end - đây là lý do tại sao tôi đã vào mẫu này ở nơi đầu tiên. Tôi tưởng tượng tôi sẽ có một thực hiện cho mỗi, ví dụ:

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock vv

Tôi muốn giữ nó mở vì vậy mà tôi có thể sử dụng EF hoặc NHibernate - một lần nữa nếu giao dịch IOrangeRepository tôi trong POCOs sau đó tôi sẽ đóng gói điều này trong chính Kho lưu trữ, bằng cách thực hiện một OrangeRepositoryNHibernate, v.v.

Tôi có đúng đường không?

Cảm ơn

EDIT: Cảm ơn phản hồi, tôi không có ai khác để đưa ra các ý tưởng này vào lúc này để được đánh giá cao!

Trả lời

9

Có, phiên bản của bạn là phiên bản an toàn nhất/tương thích nhất. Bạn vẫn có thể sử dụng nó với bất kỳ tài nguyên nào, không chỉ các tài nguyên truy cập dữ liệu mà còn với các dịch vụ web, tệp tin, bất cứ điều gì.

Lưu ý rằng với phiên bản IQueryable bạn vẫn có thể làm việc dựa trên các lớp POCO của bạn, nhưng bạn bị ràng buộc với IQueryable. Cũng nên xem xét rằng bạn có thể có mã sử dụng IQueryable và sau đó hóa ra nó bạn nhấn một trường hợp trong đó một ORM của kho lưu trữ không xử lý tốt.

5

Tôi sử dụng cùng một mẫu như bạn. Tôi rất thích nó. Bạn có thể lấy dữ liệu của mình từ bất kỳ tài nguyên nào.

Nhưng lợi thế của việc sử dụng IQuerable là bạn không phải mã API tiêu chí của riêng bạn như OrangeCriteria.

Khi NHibernate được hỗ trợ đầy đủ LINQ thì tôi có thể chuyển sang IQueryable.

Sau đó, bạn nhận được

public class OrangeRepository: IOrangeRepository { 
    public IQueryable<Orange> GetOranges(); 
} 
Các vấn đề liên quan