2013-05-14 86 views
0

讓我們根據訂單類中的屬性來分派訂單並選擇性地向客戶發送郵件。發送電子郵件的功能位於「EmailService」服務中。 我的問題是,Order.Dispatch方法應該調用EmailService根據Order類中的屬性發送電子郵件,還是應該在調用Order.Dispatch方法後調用EmailService?在DDD中做到這一點的正確方法是?實體和服務

謝謝。 NN

回答

0

我會保留在應用程序服務層上。發送位在Order.Dispatch中可能很簡單,因爲可能在服務實例中通過,但首先如何編寫電子郵件?這可能比較棘手。

將它放在某些應用程序服務層任務的操作腳本中是一種方法。您也可以響應域事件(例如OrderDispatched)和,然後發送。另一種選擇(使用服務總線時)是發佈OrderDispatchedEvent並讓您訂購訂閱端點,然後發送SendEMailCommand到電子郵件端點。

但我不會嘗試處理域本身的發送,因爲它更像是輸出生成,而不是域中通常涉及的一些業務操作/計算。這是一項業務要求,但與報告工作一樣,只是在另一個層面上。雖然與業務相關或與流程有關,但它不一定屬於該域。

只是我ZAR 0.02 :)

0

DDD is not a recipe所以有做一些不正確的方法。

如果派遣你的意思是,該命令是在途中對客戶(提示:也許在這裏需要更精確的語義),那麼這將作爲調度的訂單狀態的應用層還可以請求NotificationService通知客戶。

我認爲域名事件方法是最好的,所以一旦訂單已經發出,OrderDispatched事件將被髮布並且通知服務可以訂閱它並且將使用EmailService,SMSService等通知客戶

但訂單本身與此無關。其他一些域對象決定何時調度訂單,它將DispatchOrder命令發送給將執行調度的域服務,然後它將生成OrderDispatched事件。這意味着您的訂單不應該有調度方法,因爲它不是調度的訂單。一個簡單的狀態屬性就足夠了。

1

域事件允許您解耦問題。一旦發出訂單,它可能會發起通知感興趣訂戶的域名事件。這使您可以決定發送電子郵件到其他地方,以便訂單聚合可以保持純淨。它通常也有助於更好地捕捉語言; 訂單被派遣,發送電子郵件。

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(...); 
    } 
}