2010-06-16 41 views
6

Tôi đã đọc suy nghĩ của Greg Young và Udi Dahan về Tách biệt Truy vấn Lệnh và rất nhiều những gì tôi đọc gây ấn tượng với một hợp âm với tôi. Miền của tôi (chúng tôi theo dõi các xe đang giao hàng) có khái niệm Tuyến đường chứa một hoặc nhiều Điểm dừng. Tôi cần khách hàng của mình có thể thiết lập những điều này trong hệ thống của chúng tôi bằng cách gọi một dịch vụ web và sau đó có thể truy xuất thông tin về Tuyến đường và cách chiếc xe đang tiến triển.CQRS - Nếu một lệnh cố gắng tạo một thực thể chi tiết tổng thể "phức tạp"?

Trong quá khứ, tôi sẽ có các lớp DTO "cắt giảm" gần giống với các lớp miền của tôi và khách hàng sẽ tạo một RouteDto với một mảng StopDto (s) và gọi phương thức web CreateRoute của chúng tôi, đi qua RouteDto . Khi họ truy vấn hệ thống của chúng tôi bằng cách gọi phương thức GetRouteDetails, tôi sẽ trả về chính xác các đối tượng tương tự cho chúng. Một trong những khía cạnh hấp dẫn của CQRS là RouteDto có thể có tất cả các kiểu thuộc tính mà khách hàng muốn truy vấn, nhưng không có thiết lập nghiệp vụ khi họ tạo một Route. Vì vậy, tôi tạo một lớp CreateRouteRequest riêng biệt được truyền vào khi gọi lệnh CreateRoute ", và một lớp Route DTO được trả về dưới dạng kết quả truy vấn.

class Route{ 
    string Reference; 
    List<Stop> Stops; 
} 

Nhưng tôi cần khách hàng cung cấp cho tôi chi tiết Tuyến đường và dừng khi họ tạo tuyến đường. Khi tôi thấy nó, tôi có thể ...

Cho lớp CreateRouteRequest của tôi một thuộc tính Dừng là một mảng "cái gì đó" đại diện cho dữ liệu mà chúng cần cung cấp về mỗi điểm dừng - nhưng tôi gọi lớp này là gì ? Nó không phải là một Stop vì đó là những gì tôi đang gọi danh sách DTO bên trong Route DTO của tôi, nhưng tôi không thích "CreateStopRequest". Tôi cũng tự hỏi liệu tôi có bị mắc kẹt trong suy nghĩ của CRUD ở đây hay không bằng cách suy nghĩ về thông tin chi tiết về chủ và yêu cầu khách hàng suy nghĩ như vậy.

class CreateRouteRequest{ 
    string Reference; 
    ... 
    List<CreateStopRequest> Stops; 
} 

hoặc

Họ gọi CreateRoute, và sau đó thực hiện một số cuộc gọi đến một phương pháp AddStopToRoute. Điều này cảm thấy một chút "hành vi" nhưng tôi sẽ mất khả năng để điều trị việc tạo ra một tuyến đường bao gồm các điểm dừng của nó như là một lệnh nguyên tử duy nhất. Nếu họ tạo ra một tuyến đường và sau đó cố gắng để thêm một điểm dừng mà không do một số vấn đề xác nhận họ sẽ có một lộ trình chính xác một phần.

Thực tế là tôi không thể đưa ra một tên tốt cho danh sách các đối tượng "StopCreationData" mà tôi sẽ làm việc với tùy chọn 1, làm cho tôi tự hỏi liệu có cái gì tôi đang thiếu.

Trả lời

4

Tôi không nghĩ bạn đang thiếu gì cả.

class CreateRouteRequest{ 
    string Reference; 
    ... 
    List<CreateStopRequest> Stops; 
} 

Có vẻ tốt cho tôi. Việc thay thế sử dụng AddStopToRoute là, theo ý kiến ​​của tôi, không phải là một ý tưởng tốt vì nó tạo ra giao diện 'chatty' để được gọi hiệu quả từ xa.

2

Tuy nhiên, việc sử dụng CreateRoute * Yêu cầu * dường như cho biết bạn đang sử dụng mẫu Yêu cầu/Trả lời.

Nếu bạn đang thực sự gửi lệnh đến máy chủ, máy chủ không được trả về đối tượng/thư phản hồi. Bạn chỉ có thể có dịch vụ của bạn phơi bày một phương thức ExecuteCommand, và gọi đó, chuyển CreateRouteCommand của bạn.

Yêu cầu/phản hồi không đúng CQRS IMHO.

6

Tôi nhận ra đây là một bài đăng thực sự cũ, nhưng tôi đã vật lộn với một số mẫu tương tự gần đây và cảm thấy cần phải đóng góp cho chủ đề này.Tôi nghĩ có một điều khiến OP cảm thấy bị ngắt kết nối là họ đã shoehorning thuật ngữ tên miền sang ngôn ngữ hoạt động của riêng họ thay vì tuân theo thiết kế của họ cho miền.

Mẹo tắt là sử dụng "tạo" làm động từ. "Tạo", tôi đã tìm thấy, giống như "chèn" trong tâm trí của dev (nghĩ "CRUD"), và chúng ta thường sử dụng động từ đó khi chúng ta bắt đầu thử DDD, bởi vì nó có vẻ ít kỹ thuật hơn. Tuy nhiên, các tuyến đường "được tạo" ở đây đã tồn tại. Chúng chỉ được ghi lại trong hệ thống. Dọc theo cùng một dòng, các điểm dừng trên tuyến đường đã tồn tại, nhưng cũng đang được ghi lại. Một sự thay đổi đơn giản trong nhận thức và từ ngữ, có lẽ bằng cách sử dụng RecordRouteCommand với một bộ sưu tập tùy chọn kèm theo của RecordStopOnRouteCommand, có lẽ sẽ giải quyết được sự nhầm lẫn một chút. Việc cho phép các lệnh ghi dừng được gửi độc lập cũng sẽ cung cấp sự linh hoạt hơn trong xây dựng và tăng cường API.

Tôi cũng đồng ý với Szymon về yêu cầu so với lệnh. Từ ngữ đó cũng dẫn đến suy nghĩ trái ngược với cách tiếp cận cqrs. Nếu có một thứ mà DDD đã dạy tôi, đó là những từ mà chúng tôi sử dụng trong các dự án của chúng tôi không chỉ quan trọng, chúng có tầm quan trọng tối thượng.

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