将当前服务对象传递到域将是DDD的反模式?

问题描述 投票:-1回答:1

我提供的服务是从存储库获取域,并将其自身的实例传递给域以获取某些外部依赖关系。会变成反模式吗? RichDomainModel建议根据需要将依赖关系传递给域,但是我担心这是否可以称为循环依赖关系并会变成反模式?

class Order
{
  private $currencyVal;

  public function __construct()
  {

  }

  public function processBusinessLogic($arg1, $arg2)
  {
      // do some business logic operation on $arg1, $arg2 & $this->currencyVal
  }

  public function populateExternalValue(OrderService $service)
  {
    $this->currencyVal = $service->getCurrencyValue($this);
  }
}


OrderService 
{
  private $orderRepository;
  private $externalServiceClient;

  public function __construct(OrderRepository $orderRepository, Client $externalServiceClient)
  {
    $this->orderRepository = $orderRepository;
    $this->externalServiceClient = $externalServiceClient;
  }

  public function processDomain(Request $request)
  {
     $order = $this->orderRepository->findById($request->orderId);
     $order->populateExternalValue($this);
     $order->processBusinessLogic($request->arg1, $request->arg2);
     $this->orderRepository->save($order);
  }

  public function getCurrencyValue(Order $order) 
  { 
    return $this->externalServiceClient->getValue($order->currency)
  }
}

或者,我可以使用类似的方法,但这会导致AnemicDomainModel

$order->setCurrencyValue($this->getCurrencyValue($order));

想法?

design-patterns domain-driven-design anti-patterns
1个回答
0
投票
  1. 这绝对是循环依赖性,并且是反模式。
  2. 如果您想丰富域模型,则围绕$currencyVal的逻辑应从OrderService移入Order
  3. 由于逻辑取决于$externalServiceClient,因此该客户端也将移至Order
  4. 请注意,anemic domain model是OOP反模式;但您不必做OOP。如果您拥有丰富的域,则丰富的域模型是有意义的。对于逻辑很少的基本CRUD应用程序,可能会过度设计。
© www.soinside.com 2019 - 2024. All rights reserved.