我一直在阅读很多关于六角形的建筑,我确实得到了大部分概念(好吧,我希望我这样做),我没有找到任何示例该架构用例明智。
让我们说我的应用领域模式是让人喝醉。整个业务逻辑包含在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命令怎么办?我应该如何构建我的应用程序?
答案 0 :(得分:1)
TL; DR:我认为从DDD的角度来看,你基本上是正确的,但为了成为一个六边形设计,你应该能够在你的主要端口注册或公开你的用例:web ,控制台或“使用”建议为@chris-f-carroll。
我目前在一个大型Java8代码库项目中工作,我们按照Clean Architecture / Vertical Slicing和CQRS的原则构建了我们的应用程序。我们有一个六角形,有6个端口:网络,控制台,数据库,日程安排,队列和电子邮件。
为了初始化我们的应用程序,我们创建了所有必需的适配器,并使用它们来创建我们的应用程序实例。然后我们的应用程序模块在主端口适配器上显式注册它们的用例。最后,我们启动主端口适配器,应用程序正在运行。
Alistair Cockburn tells“端口识别有目的的对话”。在我们的例子中,由于我们的设计意味着CQRS,我们的应用程序和HTTP协议之间的有目的的对话是关于公开查询和命令(我们的用例)。
这就是在我们的Web端口中公开(uri,query)或公开(uri,command)方法而不是get(uri,handler),post(uri,handler),put(uri,handler),delete的原因(uri,handler)等。
如何公开这些查询和命令(即作为HTTP GET或POST)是我的六边形不需要知道的Web端口适配器的实现细节。
答案 1 :(得分:0)
是的,你做过/建议的是对的。
用例位于应用程序层。但请注意,这是DDD的格言,与六边形架构无关。
您的适配器
你的端口:Cockburn说“What exactly a port is and isn’t is largely a matter of taste."就个人而言,我说你有2个端口。我将其中一个命名为持久端口,你有1个适配器;我的名字另一个是'使用'端口,你有2个适配器。
六边形体系结构上的单页分页器当然是http://alistair.cockburn.us/Hexagonal+architecture