Làm thế nào chúng ta nên tạo gốc tổng hợp mới trong kiến trúc cqrs? Trong ví dụ này tôi muốn tạo AR2 gốc tổng hợp mới giữ tham chiếu đến AR1 đầu tiên.
Tôi đang tạo AR2 bằng phương pháp AR1 làm điểm bắt đầu. Cho đến nay tôi thấy một vài lựa chọn:
- Phương thức bên trong AR1
createAr2RootOpt1
Tôi có thể gọinew AR2()
và lưu đối tượng này vào db ngay lập tức bằng cách sử dụng dịch vụ miền có dấu vào kho lưu trữ. Tôi có thể phát ra sự kiện trong gốc tổng hợp đầu tiên, vd.
SholdCreateAR2Event
và sau đó có câu chuyện phi trạng thái phản ứng với điều này và đưa ra lệnhCreateAR2Command
sau đó được xử lý và thực sự tạo ra AR2 và phát raAR2CreatedEvent
. Trong trường hợp sử dụng nguồn sự kiệnSholdCreateAR2Event
sẽ không được bảo tồn trong cửa hàng sự kiện, vì nó không ảnh hưởng đến trạng thái của gốc tổng hợp đầu tiên. (Hoặc chúng ta vẫn nên lưu cái này trong cửa hàng sự kiện?)class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; void handle(CreateAR2Command command){ //init this AR with values and save publishEvent(AR2CreatedEvent()); //used for projections afterwards and saved inside AR2 event store } } class Saga{ void handle(SholdCreateAR2Event ev){ emitCommand(new CreateAR2Command()); } }
Đó là cách thích hợp hơn để làm điều này?
AR1WasCreated
gì? Có nênAR2WasCreated
không? Ngoài ra, nếu tôi sử dụng logic của bạn, tôi phát ra sự kiệnAR2WasCreated
trước khi nó thực sự được tạo ra? Và việc lưu sự kiện này trong nhật ký sự kiện của AR1 có vẻ có vấn đề, vì tôi thực sự không cần dữ liệu này trong AR1 (nó không sửa đổi bất cứ điều gì trong AR1).