私はまだDDDアプリケーションにかなり慣れていません。私はEricEvanの「ドメイン駆動設計」を読んでいて、UdiDahanによるドメインイベント救済によるドメインモデルパターンの採用を読んだことがあります...
しかし、私が理解できないことの1つは、ドメインイベントの正常な完了または失敗した完了に関する情報を、ユーザー(つまり、UIレイヤー)へのフィードバックとしてどのように返す必要があるかということです。
たとえば、次のアプリケーション層コードを使用できます。
// Application Layer
public void SubmitOrder(OrderData data)
{
var customer = GetCustomer(data.CustomerId);
var shoppingCart = GetShoppingCart(data.CartId);
customer.Purchase(shoppingCart);
}
// Domain Model
public class Customer
{
public void Purchase(ShoppingCart cart)
{
// something done with the cart...
DomainEvents.Raise(new CustomerPurchaseCompleted() { Customer = this, ShoppingCart = cart });
}
}
ここで、顧客が指定された電子メールアドレスを持っている場合に、顧客に確認電子メールを送信する次のイベントハンドラーがあるとします。
public class CustomerPurchaseCompletedHandler : Handles<CustomerPurchaseCompleted>
{
public void Handle(CustomerPurchaseCompleted args)
{
if (args.Customer.Email != null) {
// send email to args.Customer
}
else {
// report that no email will be sent...
}
}
}
私の質問は、顧客が電子メールを設定していないために電子メールが送信されないというフィードバックメッセージをUIレイヤーに「バブルアップ」するにはどうすればよいですか?
私が今日見ているオプションは、次のようなものです。
UIレイヤーに、顧客が電子メールを持っているかどうかを確認し、それに応じてメッセージに対応してもらいます。UIは、アプリケーションレベルの情報である電子メールが送信されることになっていることを認識しているため、これは悪いようです。
UserHasNoEmailException
電子メールが存在しないときにをスローし、その情報をどこかでキャッチします。情報を返すために例外を使用するべきではなく、致命的なエラーではなく、他のハンドラーを中止するべきではないため、これは本当に悪いことです...いくつか
SubmitOrder()
返品してList<FeedbackMessage>
ください。これには、このリストも返すようにメソッドPurchase()
とメソッドを変更する必要があります。DomainEvents.Raise()
これにより、ドメインモデルはUIが表示されるべきではないことを認識します...
これらの3つのオプションはどちらも、実際には適切で実用的ではないようです。では、DDDの専門家はどのようにそれを行うのでしょうか?
ありがとう。