0

Order クラスの属性に応じて、Order が発送され、オプションで顧客にメールを送信できるシナリオを考えてみましょう。メールを送信する機能は、サービス「EmailService」にあります。私の質問は、Order クラスの属性に応じて、Order.Dispatch メソッドが EmailService を呼び出して電子メールを送信する必要があるか、または Order.Dispatch メソッドを呼び出した後にアプリケーション層が EmailService を呼び出す必要があるかということです。DDDでこれを行う正しい方法はどれですか?

ありがとうございました。NN

4

3 に答える 3

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(...);
    }
}
于 2013-05-16T08:55:53.263 に答える
0

DDD はレシピではないため、何かを行う正しい方法はありません。

Dispatch が注文が顧客に届く途中であることを意味する場合 (ヒント: おそらくここではより正確なセマンティクスが必要です)、注文ステータスを Dispatched に設定するアプリケーション層は、NotificationService に顧客に通知するよう依頼することもできます。

ただし、ドメイン イベント アプローチが最適であると考えています。そのため、注文が発送されると、OrderDispatched イベントが公開され、通知サービスがそれにサブスクライブして、EmailService、SMSService などを使用して顧客に通知します。

しかし、オーダー自体はこれとは何の関係もありません。他のいくつかのドメイン オブジェクトは、いつ注文をディスパッチする必要があるかを決定し、ディスパッチを行うドメイン サービスに DispatchOrder コマンドを送信し、次に OrderDispatched イベントを生成します。これは、ディスパッチを行うのは Order ではないため、Order に Dispatch メソッドを含めないことを意味します。単純な Status プロパティで十分です。

于 2013-05-15T14:26:17.800 に答える