イベントを再生すると、それらのイベントの生成に伴うドメインロジックがすべて再生されません。通常、ドメインメソッドでイベントを発生させます。そのイベントの発生は、そのドメインオブジェクトの全体的な状態を更新するはずです。例えば
:この例では
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
と同じです。イベントハンドラは実行され、イベントを発生させたドメインメソッドは実行されません。
イベントには、ドメインモデルを更新して(更新モデルを読み込みモデルに適用する)必要なものがすべて含まれています。実行されるドメインメソッドによって、イベントを発生させることができます。
こちらがお役に立てば幸いです。より多くの情報を提供する必要があるかどうかを教えてください。
幸運!
これはかなり古い答えですが、サガは 'PurchaseMadeEvent'を受け取ったときに' PromoteCustomer'コマンドを発行する方法を知っていますか?これは、佐賀には含まれてはならないドメインロジックである、10回の購入を行った顧客に(OPの説明に従って)依存する。おそらく、常に 'TestToPromoteCustomer'を起動して、実際に宣伝を行うために集約をチェックさせますか?これはちょっと不器用だと感じます。どんな洞察もありがとう –
ええ、そうです、佐賀はTestToPromoteCustomerコマンドを送るべきです。保守性のために純度を犠牲にすることは絶対にOKだと思います。 – xelibrion