Khi bạn phát lại sự kiện, bạn sẽ không phát lại tất cả logic miền đi kèm với việc tạo các sự kiện đó. Thông thường trong phương pháp miền của bạn, bạn sẽ tăng một sự kiện; việc nâng cao sự kiện đó sau đó sẽ cập nhật trạng thái tổng thể của đối tượng miền đó.
Ví dụ:
public class Purchase {
private int _id;
private string _name;
private string _address;
private double _amount;
public Purchase(int id, string name, string address) {
//do some business rule checking to determine if event is raised
//perhaps send an email or do some logging
//etc.
if (should_i_raise_event) {
ApplyEvent(new PurchaseMadeEvent() {
ID = id,
Name = name,
Address = address
});
}
}
public UpdatePurchase(int id, double amount) {
//more checking to see if event is to be raised
if (should_i_raise_event) {
ApplyEvent(new PurchaseUpdatedEvent() {
ID = id,
Amount = amount
});
}
}
protected void OnPurchaseMade(PurchaseMadeEvent e){
_id = e.ID;
_name = e.Name;
_address = e.Address;
}
protected void OnPurchaseUpdated(PurchaseUpdatedEvent e){
_id = e.ID;
_amount = e.Amount;
}
}
Trong ví dụ này, khi các sự kiện của tôi được tái hiện lại, xử lý OnPurchaseMade
Sự kiện này sẽ được thực hiện, chứ không phải các nhà xây dựng đối tượng miền. Tương tự với PurchaseUpdatedEvent
- trình xử lý sự kiện của nó sẽ được thực thi chứ không phải phương thức miền đã tăng sự kiện.
Sự kiện chứa mọi thứ bạn cần cập nhật mô hình miền (và áp dụng các cập nhật cho mô hình đã đọc). Các phương thức miền được thực thi đưa bạn đến mức một sự kiện có thể được nâng lên.
Tôi hy vọng điều này sẽ hữu ích. Hãy cho tôi biết nếu tôi cần cung cấp thêm thông tin.
Chúc may mắn !!
Nguồn
2011-09-05 22:46:09
Tôi nhận ra đây là câu trả lời khá cũ nhưng, Saga sẽ biết cách phát hành lệnh 'PromoteCustomer' khi nhận được' PurchaseMadeEvent' như thế nào?Điều này dựa vào (theo mô tả của OP) về khách hàng đã thực hiện 10 lần mua hàng, đó là logic miền mà Saga không nên chứa. Có lẽ luôn kích hoạt 'TestToPromoteCustomer' và để tổng hợp thực hiện kiểm tra để thực sự thực hiện chương trình khuyến mãi? Điều này cảm thấy một chút vụng về mặc dù .. Cảm ơn cho bất kỳ cái nhìn sâu sắc –
Vâng, bạn nói đúng, saga nên gửi lệnh TestToPromoteCustomer. Tôi nghĩ rằng nó hoàn toàn OK để hy sinh tinh khiết cho bảo trì. – xelibrion