讓我們根據訂單類中的屬性來分派訂單並選擇性地向客戶發送郵件。發送電子郵件的功能位於「EmailService」服務中。 我的問題是,Order.Dispatch方法應該調用EmailService根據Order類中的屬性發送電子郵件,還是應該在調用Order.Dispatch方法後調用EmailService?在DDD中做到這一點的正確方法是?實體和服務
謝謝。 NN
讓我們根據訂單類中的屬性來分派訂單並選擇性地向客戶發送郵件。發送電子郵件的功能位於「EmailService」服務中。 我的問題是,Order.Dispatch方法應該調用EmailService根據Order類中的屬性發送電子郵件,還是應該在調用Order.Dispatch方法後調用EmailService?在DDD中做到這一點的正確方法是?實體和服務
謝謝。 NN
我會保留在應用程序服務層上。發送位在Order.Dispatch
中可能很簡單,因爲可能在服務實例中通過,但首先如何編寫電子郵件?這可能比較棘手。
將它放在某些應用程序服務層任務的操作腳本中是一種方法。您也可以響應域事件(例如OrderDispatched
)和,然後發送。另一種選擇(使用服務總線時)是發佈OrderDispatchedEvent
並讓您訂購訂閱端點,然後發送SendEMailCommand
到電子郵件端點。
但我不會嘗試處理域本身的發送,因爲它更像是輸出生成,而不是域中通常涉及的一些業務操作/計算。這是一項業務要求,但與報告工作一樣,只是在另一個層面上。雖然與業務相關或與流程有關,但它不一定屬於該域。
只是我ZAR 0.02 :)
DDD is not a recipe所以有做一些不正確的方法。
如果派遣你的意思是,該命令是在途中對客戶(提示:也許在這裏需要更精確的語義),那麼這將作爲調度的訂單狀態的應用層還可以請求NotificationService通知客戶。
我認爲域名事件方法是最好的,所以一旦訂單已經發出,OrderDispatched事件將被髮布並且通知服務可以訂閱它並且將使用EmailService,SMSService等通知客戶
但訂單本身與此無關。其他一些域對象決定何時調度訂單,它將DispatchOrder命令發送給將執行調度的域服務,然後它將生成OrderDispatched事件。這意味着您的訂單不應該有調度方法,因爲它不是調度的訂單。一個簡單的狀態屬性就足夠了。
域事件允許您解耦問題。一旦發出訂單,它可能會發起通知感興趣訂戶的域名事件。這使您可以決定發送電子郵件到其他地方,以便訂單聚合可以保持純淨。它通常也有助於更好地捕捉語言; 當訂單被派遣,發送電子郵件。
public class Order
{
public Order(string id)
{
Guard.ForEmpty(id, "id");
Id = id;
}
public string Id { get; private set; }
public void Dispatch()
{
DomainEvents.Raise(new OrderDispatchedEvent());
}
}
public class MailService : IHandle<OrderDispatchedEvents>
{
private readonly IMailSender _mailSender:
public MailService(IMailSender mailSender)
{
_mailSender = mailSender;
}
public void Handle(OrderDispatchedEvent @event)
{
_mailSender.Send(...);
}
}