【发布时间】:2014-08-21 03:11:43
【问题描述】:
我已经阅读了很多关于六边形架构的文章,并且我确实了解了大部分概念(嗯,我希望我了解),但我没有找到该架构使用的任何 示例 -区分大小写。
假设我的应用领域模型是让人喝醉。整个业务逻辑包含在Person 类中,该类位于领域层中。
class Person
{
private $name;
private $age;
function __construct($name, $age)
{
$this->age = $age;
$this->name = $name;
}
public function drink()
{
if ($this->age < 18) {
echo $this->name . ' cant drink';
}
echo $this->name . ' drinks tequila';
}
}
域层还包含一个PersonRepository
interface PersonRepository
{
public function findPersonByName($name);
}
实施者:
class DoctrinePersonRepository implements PersonRepository
{
public function findPersonByName($name)
{
// actual retrieving
}
}
假设我想通过访问:GET /person/johnDoe/drink 让一个人喝醉。
我应该创建一个像这样的用例:
class MakePersonDrinkCase
{
/**
* @var PersonRepository
*/
private $personRepository;
function __construct(PersonRepository $personRepository)
{
$this->personRepository = $personRepository;
}
function makePersonDrunk($name)
{
$person = $this->personRepository->findPersonByName($name);
if ($name) {
throw new \Exception('Person not found');
}
$person->drink();
}
}
并从控制器调用它?这个提到的案例应该驻留在领域层还是应用层?在这种情况下,什么是端口和适配器?如果我想有办法让这个人喝醉——一种来自 GET 请求,另一种来自php console person:drink John CLI 命令?我应该如何构建我的应用程序?
【问题讨论】:
-
我想你快到了 - 关键是要认识到域逻辑(一个人应该不能喝酒,除非他们超过 18 岁)依赖于域模型而不是域之外模型。周围的基础设施只是为了使来自外部世界的命令适应您的域模型的命令而存在。
-
喜欢你的例子:D 我最近写了一篇回答你的一些问题的帖子,你可能会觉得它很有用:jenko.me/ddd/2015/01/23/building-a-house-with-ddd
-
另一篇在某种程度上解释它的文章:t.co/U7SZZcvevn
标签: architecture domain-driven-design n-tier-architecture hexagonal-architecture