我对 DDD 应用程序还很陌生。我正在阅读 Eric Evan 的“领域驱动设计”,并阅读了 Udi Dahan的“领域事件拯救”中的“使用领域模型模式”……
我无法弄清楚的一件事是如何将有关领域事件成功或不成功完成的信息作为反馈返回给用户(即 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 不应该显示什么......
这三个选项似乎都不是很好和实用的。那么 DDD 专家是如何做到的呢?
谢谢。