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.