自从我开始构建我的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
答案 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方法将具有不同的参数和返回类型。