2013-07-24 33 views
16

Tôi đang cố gắng hiểu "Mẫu thiết kế đối tượng truy vấn". Tôi không thể tìm thấy những ví dụ tốt và đơn giản cho nó. Ai đó có thể giúp tôi hiểu mô hình thiết kế này là gì và trong vấn đề gì chúng ta có thể thực hiện điều này?Tại sao mẫu thiết kế đối tượng truy vấn

+0

http: // stackoverflow.com/questions/2068478/query-object-pattern-design-pattern – Bart

Trả lời

25

Mẫu thiết kế truy vấn thường được sử dụng kết hợp với mẫu thiết kế Repository.

Hãy để chúng tôi đi với một ví dụ và sau đó tôi sẽ cho một bài viết hay để đọc. Chúng ta hãy nói rằng chúng ta có một cơ sở dữ liệu mà chúng tôi lưu trữ thông tin về khách hàng và đơn đặt hàng của họ, vv

Sau đó, chúng tôi tạo ra một kho lưu trữ ban đầu như thế này:

class CustomerRepository() { 
    Customer GetById(int id) { // implementation } 
    void DeleteCustomer(int id) { // impl } 
    void GetCustomerWithOrder(int orderId); 
    void GetCustomersWithOrdersMoreThan(int numberOfOrders); 
} 

Như bạn có thể thấy đối với mỗi truy vấn, chúng tôi đã tạo ra một trong kho lưu trữ rất tốt và tốt đối với số lượng truy vấn hạn chế nhưng khi chúng tôi có nhiều truy vấn và bắt đầu phức tạp với nhiều kết hợp (ví dụ: giúp khách hàng mua hàng vượt quá 1000 và sống ở New York và hạn mức tín dụng của họ ít hơn 3000) thì chúng tôi sẽ kết thúc với một danh sách dài các phương pháp và thậm chí tệ hơn, làm rò rỉ một số logic nghiệp vụ trong hình dạng của quer bên trong kho mà chúng tôi không muốn xảy ra.

Vì vậy, để cấu trúc lại rằng chúng ta thay đổi kho để một cái gì đó như thế này:

class CustomerRepository() { 
    Customer[] Get(Query query) { // implementation } 
    void DeleteCustomer(int id) { // impl } 
} 

Như bạn có thể thấy chúng tôi đang đi qua một Query Object đại diện cho truy vấn của chúng tôi trong các hình thức của một đối tượng và kho có một và chỉ kho lưu trữ để thực hiện truy vấn đó và cung cấp cho chúng tôi kết quả trở lại.

Bây giờ cách triển khai đối tượng truy vấn đó và cách xây dựng nó sẽ đòi hỏi nhiều mã nên tại thời điểm này tôi sẽ hướng dẫn bạn đến số nice article này. Đó là trong C# nhưng bạn sẽ tìm thấy nó rất hữu ích, bạn cũng có thể nhìn vào Criteria API (Java) được sử dụng bởi NHibernate để xem một triển khai khác nhau nhưng tương tự.

+0

ok, tôi hiểu việc sử dụng chính xác mẫu thiết kế đối tượng truy vấn ngay bây giờ. Nice ví dụ và đẹp explanaiton.Cảm ơn bạn rất nhiều. Và bây giờ tôi có một câu hỏi khác liên quan đến điều này. API tiêu chí cung cấp mẫu thiết kế đối tượng truy vấn và đơn giản là chúng ta có thể sử dụng nó. Nhưng hơi bối rối về việc thực hiện điều này một cách có lập trình. Trong ví dụ bạn đã đề cập ở trên, bạn đang tiêm đối tượng Query. Nhưng nó trông như thế nào nếu tôi muốn thực hiện điều này trong ứng dụng của tôi? –

+1

@santu Bạn đang sử dụng ngôn ngữ nào và bạn đã kiểm tra bài viết trong C# i đã nói với bạn chưa? –

+0

Tôi đang sử dụng Java. Tôi đã kiểm tra C#. Nhưng tôi nghĩ làm thế nào để sử dụng mô hình này chỉ cho các cuộc gọi DAO mà các hoạt động riêng biệt khác nhau của CRU. –

4

Đối tượng truy vấn thể hiện truy vấn được viết bằng ngôn ngữ của miền và đã triển khai mẫu Đối tượng truy vấn. Các Object pattern Query như mô tả của Fowler là “một đối tượng đại diện cho một truy vấn cơ sở dữ liệu.” Nếu không có một số cơ chế truy vấn, Repository sẽ tràn ngập với các phương pháp hồi vô số ví dụ như có thể thấy trong đoạn mã này:

public interface ICustomerRepository  
{   
    IEnumerable<Customer> FindAll(); 
    IEnumerable<Customer> FindAllVIPCustomers(); 
    IEnumerable<Customer> FindByOrder(Guid ID); 
    IEnumerable<Customer> FindAllCustomersThatHaveOutstandingOrders(); 
    …  
} 

Thay vào đó, đối tượng truy vấn cho phép bất kỳ truy vấn nào được xây dựng và sau đó được gửi đến kho lưu trữ để được thỏa mãn. Lợi ích chính của mô hình đối tượng truy vấn là nó hoàn toàn trừu tượng hóa ngôn ngữ truy vấn cơ sở dữ liệu cơ bản và do đó giữ các mối quan tâm cơ sở hạ tầng về sự kiên trì dữ liệu và truy xuất ra khỏi lớp nghiệp vụ. Tuy nhiên, tại một số điểm, ngôn ngữ truy vấn thô của cơ sở dữ liệu cần được tạo; điều này đạt được bằng cách sử dụng một QueryTranslator cụ thể cho cơ sở dữ liệu để lấy các đối tượng truy vấn và chuyển đổi chúng thành ngôn ngữ của cơ sở dữ liệu.

Từ sách mẫu thiết kế Pro ASP.NET.

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