0

自从我开始构建我的 DDD/Hexagonal 架构应用程序以来已经有一段时间了,我对与它们相关的大量概念感到不知所措。

尽管当我发现有必要时,我开始略微尝试并尝试应用概念。我发现仍然有很多我不能甚至我不想应用到我的应用程序中,其中一些是:适配器、命令(CQRS?)、事件..

除此之外,我对与六边形体系结构有关的事情有点卡住了。我试图应用外部行为的定义应该依赖于内部,所以基础设施层 -> 应用层 -> 域层

在我的例子中,我在我的应用层中定义了服务作为 LoginService 的这个例子:

class LoginUserService implements ApplicationServiceInterface
{
private $userRepository;
private $session;

public function __construct(UserRepositoryInterface $userRepository, Session $session)
{
    $this->userRepository = $userRepository;
    $this->session = $session;
}

public function execute($request = null)
{
    // TODO: Implement execute() method.
    $userName = $request->get('user');
    $password = $request->get('password');
    $user = $this->userRepository->findByUsername($userName);
    if (!empty($user) && $user->validate($password)) {

        $this->session->start();
        $this->session->set('user', array('id' => $user->getUserId(), 'username' => $user->getName(), 'email' => $user->getEmail()));
        return true;
    } else {
        return false;
    }
}
}

但是,我很确定我在吹嘘六边形架构所代表的依赖声明。因为我的应用层依赖于基础设施层。(在这种情况下,$this->userRepository->findByUsername($userName);是注入到应用程序的 serviceContainer 中的 DoctrineUserRepository 的一部分)

我的 repo 在 github 中完全可用:Malendar Repository

如何处理这个依赖于数据库输出的服务案例?另外,我跳过哪些概念会很好用?

先谢谢你=D

4

1 回答 1

2

UserRepositoryInterface应该在域层中定义。如果它在基础设施层,你应该把它移到领域层。

当您创建时UserRepositoryInterface,您创建了一个所有基础设施层实现都必须履行的合同。这是依赖倒置原则的教科书示例。

您可以放心地假设实现履行了合同。这个假设不会产生对基础设施层的依赖。

因此,LoginUserService仅取决于UserRepositoryInterface(应该是域层的一部分)和Session.

我会更担心Session依赖和$request参数。我不知道 PHP 和您使用的框架,但在 MVC 模式中,我宁愿将两者都保留在控制器中,将逻辑委托给应用程序层。经验法则是应用层不应该负责处理任何特定于 HTTP 的问题。我会让LoginUserService.execute方法接受$userName$password参数并返回登录的用户详细信息。

它当然会破坏implements ApplicationServiceInterface部分,但无论如何都应该删除这个接口。应用层方法将具有不同的参数和返回类型。

于 2015-11-06T23:33:11.377 回答