DDD在实际项目中的实现步骤
Steps for DDD implementation in real project
在介绍了领域驱动设计之后,我意识到 DDD 关注的是业务模型,而不是任何特定的 framework/language/ 或技术。作为一个 数据驱动的心态持有者 (x),我正在努力确定在我们的实际项目中实施 DDD 的步骤。我想知道现实世界 DDD 实施中的实际步骤是什么。例如:
- 首先确定业务领域模型(?)
- 将每个用例、用户故事、业务需求与模型相关联
- 使用规定的 DDD 框架开发解决方案
或其他什么?
领域驱动设计鼓励增量开发,而不是瀑布式开发。 DDD 是关于对复杂领域的理解,根本无法一蹴而就。我建议经常重复您给出的步骤。
还有一点就是用例和业务需求与领域模型高度耦合。单独创建它们真的很难。
我通常在开始时做的是识别域中的所有实体。
例如,让我们采用典型的博客方法。
我们可以拥有这些实体、用户、post 和管理员。
有时一开始无法识别所有这些,因此我没有获得 paralisys 分析,而是先处理代码。
因此,对我来说,下一个自然步骤是确定这些实体之间如何协作。是写post的用户吗?那我们在代码中展示一下:
$user->create(new Post($title, $body));
然后管理员可能需要审核 post 以接受它并在页面中显示它:
$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 关注的是业务模型,而不是任何特定的 framework/language/ 或技术。作为一个 数据驱动的心态持有者 (x),我正在努力确定在我们的实际项目中实施 DDD 的步骤。我想知道现实世界 DDD 实施中的实际步骤是什么。例如:
- 首先确定业务领域模型(?)
- 将每个用例、用户故事、业务需求与模型相关联
- 使用规定的 DDD 框架开发解决方案
或其他什么?
领域驱动设计鼓励增量开发,而不是瀑布式开发。 DDD 是关于对复杂领域的理解,根本无法一蹴而就。我建议经常重复您给出的步骤。
还有一点就是用例和业务需求与领域模型高度耦合。单独创建它们真的很难。
我通常在开始时做的是识别域中的所有实体。
例如,让我们采用典型的博客方法。
我们可以拥有这些实体、用户、post 和管理员。
有时一开始无法识别所有这些,因此我没有获得 paralisys 分析,而是先处理代码。
因此,对我来说,下一个自然步骤是确定这些实体之间如何协作。是写post的用户吗?那我们在代码中展示一下:
$user->create(new Post($title, $body));
然后管理员可能需要审核 post 以接受它并在页面中显示它:
$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));
}
}
如您所见,我们在编码时并没有考虑很多我们意识到我们需要的东西。希望您会感兴趣!!