DDD在实际项目中的实施步骤



在介绍了域驱动设计之后,我意识到DDD关注的是业务模型,而不是任何特定的框架/语言/或技术。作为数据驱动的心态持有者(x),我正在努力确定在实际项目中实施DDD的步骤。我想知道在现实世界中DDD实现的实际步骤是什么。例如:

  1. 首先确定业务领域模型(?)
  2. 将每个用例、用户故事、业务需求与模型联系起来
  3. 开发具有DDD规定框架的解决方案

还是别的什么?

我通常在开始时所做的是识别域的所有实体。

例如,让我们采用典型的博客方法。

我们可以拥有这个实体、用户、帖子和管理员。

有时一开始不可能识别出所有的代码,所以我没有得到分析视差而是先处理代码。

所以,对我来说,下一个自然的步骤是确定这些实体是如何在它们之间协作的。是写帖子的用户吗?然后让我们在代码中显示:

$user->create(new Post($title, $body));

然后,管理员可能需要审查帖子以接受它并在页面上显示:

$admin->reviewPostFrom($user);

正如你所看到的,我们试图使代码尽可能自然,这就是我们的想法,能够向领域专家解释代码。

接下来是通过定义用例,我们可以创建应用程序需要的操作。

我们可以使用命令方法,例如:

class CreateNewPost
{
    protected $userId;
    protected $postTitle;
    protected $postBody;
    public function __construct(UserId $idUser, PostTitle $postTitle, PostBody $postBody)
    {
        // Here we can make some kind of validation of the data
    }
}

接下来,我们将命令发送到我们的命令总线,后者将负责处理此命令。所有用例都发生在命令处理程序中:

class CreateNewPostHandler
{
    // here we inject all dependencies we need to accomplish our use case
    public function __construct(UserRepositoryInterface $userRepo, etc..)
    {
        $this->userRepository = $userRepo;
        etc...
    }
    public function handle(CreateNewPost $command)
    {
        $user = $userRepo->getById($command->userId);
        $user->create(new Post($command->getTitle(), $command->getBody()));
        // Maybe we can launch an event here that launches a notification to admin, etc.
        $this->eventDispatcher(new PostCreatedEvent($user));
    }
}

正如你所看到的,我们在编码时并没有考虑到我们需要的很多东西。我希望你感兴趣!!

领域驱动设计鼓励增量开发,而不是瀑布式开发。DDD是关于对复杂领域的理解,它根本不可能一次完全被发现。我建议你经常重复你的步骤。

另一件事是用例和业务需求与域模型高度耦合。单独创建它们真的很难。

最新更新