Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 在实际项目中实施DDD的步骤_Domain Driven Design_Use Case - Fatal编程技术网

Domain driven design 在实际项目中实施DDD的步骤

Domain driven design 在实际项目中实施DDD的步骤,domain-driven-design,use-case,Domain Driven Design,Use Case,在介绍域驱动设计之后,我意识到DDD关注的是业务模型,而不是任何特定的框架/语言/或技术。作为一个数据驱动的思维定势持有者,我正在努力确定在实际项目中实施DDD的步骤。我想知道现实世界中DDD实现的实际步骤是什么。例如: class CreateNewPost { protected $userId; protected $postTitle; protected $postBody; public function __construct(UserId $id

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

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
    }
}
首先确定业务领域模型 将每个用例、用户情景、业务需求与模型关联起来 使用指定的DDD框架开发解决方案
还是别的什么?

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


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

域驱动设计鼓励增量开发,而不是瀑布式开发。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));
    }
}

正如您所看到的,我们在编码时没有想到很多我们需要的东西。我希望你对它感兴趣

我通常在开始时识别域中的所有实体

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

我们可以有这些实体,用户,帖子和管理员

有时不可能一开始就识别出所有的代码,所以我不需要分析并行,而是先处理代码

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

$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理论所束缚。从stack overflow中的几个帖子中,我知道DDD只适用于非常复杂的项目。我并不完全同意。如果能定义一些清晰的步骤,让每个新来者都能得到一些指导,那会更好。嗨,Mequrel,谢谢你的回复。作为一个新手,我深陷于DDD理论。从stack overflow中的几篇文章中,我了解到DDD只适用于非常复杂的项目。我并不完全同意。如果能定义一些清晰的步骤,让每个特别的新手都能得到一些指导,那会更好。