相关疑难解决方法(0)

域驱动设计和IoC /依赖注入

我现在正在尝试应用我对DDD的了解,我对Domain模型中依赖关系的流程有点困惑.

我的问题是:

  1. 企业是否应该了解域中的工厂,存储库,服务?
  2. 存储库是否应该知道域中的服务?

困扰我的另一件事是当我想要添加集合并将实体添加到集合时如何处理集合.

假设我正在开发一个简单的CMS.在CMS中,我有一个包含标签实体的文章实体和标签集合.

现在,如果我想添加一个新标签的关系.有什么更好的方法呢?(PHP中的示例)

$article->tags->add(TagEntity);
$articleRepository->save($article);
Run Code Online (Sandbox Code Playgroud)

或者我可以用服务来做.

$articleService->addTag($article, TagEntity);
Run Code Online (Sandbox Code Playgroud)

你怎么看?

谢谢.

dependencies domain-driven-design dependency-injection inversion-of-control

13
推荐指数
3
解决办法
8503
查看次数

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
查看次数