2017-10-01 7 views
3

私は、アプリケーション内の複数のロールによって特定の動作を実行できる集約で作業しています。しかしそれが起こる前に、かなり複雑な検証が行われます。役割ごとに異なるのはこの検証です。通常、アクションが実行できるかどうかを判断するために、さまざまな構成設定がチェックされています。集計にビヘイビアを挿入するにはどうすればよいですか?

例として、OrderLinesを追加できるOrderがあるとしましょう。私が役割を持っている場合、従業員iは€100まで注文することが許されるかもしれません - そして、私が役割購入者を持っているなら私は€1000まで注文することが許されるかもしれません - 。

ユーザーインスタンスをaddOrderLineメソッドに提供することでこれを解決できますが、ユーザーコンテキストを注文コンテキストにリークさせることができます。次の論理的なこと、これは私がやってきたことです、その検証ロジックをメソッド呼び出しに注入することです。私は、これらのメソッドポリシーを呼び出して、私はそこに利用できる、関連するユーザ情報を持っているように、アプリケーションサービスで適切な政策をインスタンス化しています:

<?php 
class Order { 
    public function addItem(OrderPolicy $policy, Item $item, int $amount) { 
     if (!$policy->canPurchase($item->getPrice() * $amount)) 
      throw new LimitExceededException(); 

     /* add item here */ 
} 

class OrderService { 
    public function addItem(User $user, $orderId, $itemId, int $amount) { 
     $order = $this->orderRepo->getForUser($user, $orderId); 
     $item = $this->itemRepo->get($itemId); 
     $policy = $this->getOrderPolicyFor($user); 

     $order->addItem($policy, $item, $amount); 
    } 
} 

class PurchaserOrderPolicy 
{ 
    function canPurchase($amount) { 
     return ($amount <= 1000); 
    } 
} 

これは罰金だが、今では私の注文状況は、論理に基づいているように思えますユーザーの役割(ポリシークラス)は、それについては知らないことになっています。

DDDはこれに対処する他の方法も提供していますか?たぶん仕様?これはうまくいくようですか?ポリシークラスはどこに属していますか?

+0

私はロジックに移動して、サービスに集約させないことをお勧めします。 OrderServiceのチェックを行い、ユーザーがアイテムを追加できない場合は、サービスから例外がスローされます。 –

答えて

2

ここでは、注文システムと購入ポリシーシステムの2つのサブドメイン/システムが使用されているようです。あなたは物事を分離しておく必要があります、あなたの腸は正しいです。これは、最大注文値に関する検証が、実際のアイテムの追加に対して最終的に一貫した方法でチェックされることを意味します。無効な注文を防止する前に、または無効な注文から回復しようとする前に、これを行うことができます。

これを行う場合、アプリケーションサービスはこれを調整して注文を拒否することができます。

これをプロセスとして実装し、イベント(イベントドリブンアーキテクチャの場合)またはスケジュールされたタスク/ cronジョブとして実行してすべてをチェックするApplyPoliciesToOrdersSagaを持つことができますポリシーに対する命令(古典的なアーキテクチャで)

+0

これを事前に処理する際には、集約外のポリシーを呼び出すことになります。この場合は、アプリケーションサービスでですか?私はそれが保護すべき不変条件の一つであると思われるので、それをaggrateに含めました。どのようにこれを見ますか? – NSSec

+0

@ NSSecはい、私は他のシステムからクエリサービスを呼び出し、項目が許可されている場合はローカル集約も呼び出します。ポリシーパターン(存在する場合)はOKですが、私が言ったように、あなたは他のシステムでそれを使用します。 –

関連する問題