DDD和六边形架构 - 服务

时间:2015-11-06 13:40:41

标签: php domain-driven-design silex hexagonal-architecture

自从我开始构建我的DDD /六角形架构应用程序以来已经有一段时间了,我对与它们相关的概念数量感到非常不满。

虽然我开始略微尝试在我发现必要时尝试应用概念。我发现还有很多我不能,甚至我不考虑申请我的应用程序,其中一些是:适配器,命令(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的一部分)

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

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

先谢谢你= D

1 个答案:

答案 0 :(得分:1)

应在域层中定义UserRepositoryInterface。如果它位于基础架构层中,则应将其移至域层。

创建UserRepositoryInterface时,您创建了一个所有基础架构层实施必须满足的合同。它是Dependency Inversion principle的教科书示例。

您可以放心地假设实施符合合同。此假设创建对Infrastructure Layer的依赖。

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

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

它当然会破坏implements ApplicationServiceInterface部分,但无论如何都应删除此界面。 Application Layer方法将具有不同的参数和返回类型。