私は、アプリケーション内の複数のロールによって特定の動作を実行できる集約で作業しています。しかしそれが起こる前に、かなり複雑な検証が行われます。役割ごとに異なるのはこの検証です。通常、アクションが実行できるかどうかを判断するために、さまざまな構成設定がチェックされています。集計にビヘイビアを挿入するにはどうすればよいですか?
例として、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はこれに対処する他の方法も提供していますか?たぶん仕様?これはうまくいくようですか?ポリシークラスはどこに属していますか?
私はロジックに移動して、サービスに集約させないことをお勧めします。 OrderServiceのチェックを行い、ユーザーがアイテムを追加できない場合は、サービスから例外がスローされます。 –