2009-11-03 27 views
6

Im nhầm lẫn. Đây là một mục blog của Ayende Rahien Repository is the new singleton.Mẫu kho DDD với NHibernate

Tôi tin rằng một kho lưu trữ chỉ nên thực hiện các hoạt động CRUD và không phải truy vấn bổ sung nếu không bạn sẽ kết thúc với các phương pháp như thế này trên kho lưu trữ của bạn.

  1. FindCustomer (id)
  2. FindCustomerWithAddresses (id)
  3. FindCustomerWith ..

Vì vậy, câu hỏi của tôi là, nơi (trong những gì layer) sẽ một làm các truy vấn để lấy các thực thể?

+0

Hai bài đăng hữu ích về chủ đề: bởi [Jimmy Bogard] (http://www.lostechies.com/blogs/jimmy_bogard /archive/2009/09/02/ddd-repository-implementation-patterns.aspx) và [Greg Young] (http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the- generic-repository.aspx). Tôi bị hút về phía một phương pháp lai: các kho chung cho các hành động đơn giản và các đối tượng truy vấn cho các đối tượng phức tạp hơn. Tôi thường không tiết lộ kho lưu trữ cho bất cứ điều gì đang sử dụng logic của tôi (UI, dịch vụ), nhưng cung cấp chức năng trong một mô hình giống như dịch vụ/mặt tiền, do đó, cách tiếp cận kép không được tiếp xúc bên ngoài lớp mặt tiền này. – tijmenvdk

Trả lời

3

Có thể viết kho lưu trữ có các hoạt động CRUD mặc định. Ví dụ:

public interface IRepository<TEntity> 
{ 
    TEntity FindByIdentity(object identity); 
    TEntity FindBy(Expression<Func<TEntity, bool>> specification); 
    IList<TEntity> FindAll(); 
    IList<TEntity> FindAllBy(Expression<Func<TEntity, bool>> specification); 
    TEntity Save(TEntity saveable); 
    void Delete(TEntity deletable); 
} 

Biểu> về cơ bản là Specification và truy vấn có thể được tóm lược như vậy. Nếu chúng tôi có loại Kho lưu trữ thì chúng tôi không cần phải viết nhiều kho lưu trữ cụ thể.

Đường dẫn thay thế tạo đối tượng Truy vấn. Chúng ta có thể thêm giao diện của truy vấn đó vào lớp Logic/Busines Logic và triển khai thực hiện lớp Dịch vụ/Dữ liệu. Bằng cách đó, chúng tôi có các truy vấn được đặt tên độc đáo như AllPreferredCustomersQuery. Nó khá giống với thông số kỹ thuật, nhưng các đặc tả không sử dụng cơ sở hạ tầng và do đó chúng ta có thể thêm nó vào lớp Core/Business Logic. Truy vấn đối tượng có nhiều cấu hình hơn (ví dụ: có thể thêm giới hạn, tìm nạp chiến lược, tham gia, v.v.)

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