Quando si ripetono gli eventi, non si riproduce tutta la logica del dominio associata alla generazione di tali eventi. Solitamente nel tuo metodo di dominio puoi generare un evento; l'innalzamento di quell'evento dovrebbe quindi aggiornare lo stato generale di quell'oggetto dominio.
Ad esempio:
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;
}
}
In questo esempio, quando i miei eventi vengono riprodotti, il gestore di eventi OnPurchaseMade
otterrà eseguito, non il costruttore dell'oggetto dominio. Lo stesso con lo PurchaseUpdatedEvent
- il suo gestore di eventi verrà eseguito, non il metodo di dominio che ha generato l'evento.
L'evento contiene tutto ciò che è necessario per aggiornare il modello di dominio (e applicare gli aggiornamenti al modello di lettura). I metodi di dominio che vengono eseguiti ti portano al punto che un evento può essere sollevato.
Spero che questo aiuti. Fammi sapere se ho bisogno di fornire ulteriori informazioni.
Buona fortuna !!
fonte
2011-09-05 22:46:09
Mi rendo conto che questa è una risposta piuttosto vecchia, ma come sarebbe possibile che la Saga emettesse un comando 'PromoteCustomer' quando riceve un' PurchaseMadeEvent'?Ciò si basa (come da descrizione del PO) sul fatto che il cliente abbia effettuato 10 acquisti, che è la logica di dominio che la Saga non dovrebbe contenere. Forse spara sempre un 'TestToPromoteCustomer' e lascia che l'aggregato faccia il check per fare effettivamente la promozione? Questo sembra un po 'maldestro però .. Grazie per qualsiasi intuizione –
Sì, hai ragione, la saga dovrebbe inviare comandi TestToPromoteCustomer. Penso che sia assolutamente OK sacrificare la purezza per la manutenibilità. – xelibrion