Когда вы воспроизводите события, вы не воспроизводите всю логику домена, которая сопровождала генерацию этих событий. Обычно в методе вашего домена вы вызываете событие; повышение этого события затем должно обновить общее состояние этого объекта домена.
Например:
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;
}
}
В этом примере при воспроизведении моих событий будет выполняться обработчик события OnPurchaseMade
, а не конструктор объекта домена. То же самое с PurchaseUpdatedEvent
- будет выполняться обработчик события, а не метод домена, который вызвал событие.
Событие содержит все, что нужно для обновления модели домена (и применения обновлений к модели чтения). Методы домена, которые выполняются, приводят вас к тому, что событие может быть вызвано.
Надеюсь, это поможет. Дайте мне знать, если мне нужно будет предоставить больше информации.
Удачи !!