小编jon*_*nyc的帖子

DDD 在域服务上注入存储库 VS 在应用程序服务上编排流程

我目前正在使用 DDD,我有一个关于应用程序服务 VS 域服务 VS 存储库接口的问题

我所知:

  • 应用程序服务用于处理用例流,包括域之上所需的任何其他问题。

  • 领域服务用于封装不适合单个领域对象的行为。

因此,考虑到以下用例:

“当您在系统中创建新的汽车实体(uuid,名称)时,汽车名称必须是唯一的(不再存在具有该名称的汽车),或者汽车名称不能包含数据库中的另一个汽车名称作为子字符串”,对于例如,这只是一个用例的示例,它迫使我在创建对象时查看存储库中的其他实体

所以问题是:我应该在哪里进行检查和/或注入存储库接口?

- 选择 1)在应用程序服务中,注入 RepositoryCarInterface,进行检查并保存 Car:

class CreateCarApplicationService
{
    private carRepositoryInterface $carRepository;

    public function __construct(CarRepositoryInterface $carRepository)
    {
        $this->carRepository = $carRepository;
    }

    public function __invoke(string $carUuid, string $carName): void
    {
        $this->ensureCarNameIsUnique($CarName);
        $car = new Car($carUuid,$carName);
        $this->carRepository->save($car);
    }

    private function ensureCarNameIsUnique(string $carName): void
    {
        $CarSameName = $this->carRepository->findOneByCriteria(['name' => $carName]);
        if ($carSameName) {
            throw ExceptionCarExists();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

- 选择 2)将此逻辑创建到域服务中(目的是使域逻辑靠近域对象)并从更简单的应用程序服务调用它,该服务最终负责保存与数据库交互的模型:

class CreateCarDomainService
{
    private carRepositoryInterface $carRepository;


    public function …
Run Code Online (Sandbox Code Playgroud)

domain-driven-design dependency-injection repository

5
推荐指数
1
解决办法
1328
查看次数