我在服务层的应用程序中遇到依赖关系问题。
我有以下课程:
<?php
class UserService{
private $userRepository;
private $vocationService;
private $roleService;
public function __construct(UserRepository $userRepository, VocationService $vocationService, RoleService $roleService)
{
$this->userRepository = $userRepository;
$this->vocationService = $vocationService;
$this->roleService = $roleService;
}
}
我只注入了三个依赖项。
假设,我想添加下一个依赖项,例如:NextService。
我的构造函数会再次增长。
如果我想在构造函数中传递更多依赖项怎么办?
也许我应该通过传递 IoC 容器来解决这个问题,然后获得所需的类?
这是一个例子:
<?php
class UserService{
private $userRepository;
private $vocationService;
private $roleService;
public function __construct(ContainerInterface $container)
{
$this->userRepository = $container->get('userRepo');
$this->vocationService = $container->get('vocService');
$this->roleService = $container->get('roleService');
}
}
但现在我的用户服务类取决于我注入的 IoC 容器。
如何遵循良好实践来解决问题?
问候,亚当
由于多种原因,将容器作为服务的依赖项注入被认为是一种不好的做法。我认为这里的要点是找出原因,然后尝试理解导致您考虑“注入容器”作为可能的解决方案以及如何解决这个问题的问题。
In 面向对象编程 http://en.wikipedia.org/wiki/Object-oriented_programming,明确定义对象之间的关系很重要。当您查看给定的对象依赖项时,通过查看其公共 API 应该可以直观地了解该对象的行为方式以及它所依赖的其他对象是什么。
让你的对象依赖也是一个坏主意依赖解析器 http://en.wikipedia.org/wiki/Dependency_injection,在您共享的示例中,如果没有container
这是由提供的DI组件 http://symfony.com/doc/current/components/dependency_injection/introduction.html。
如果您想在其他地方使用该对象,例如在使用另一个框架的应用程序中,则必须重新考虑对象获取其依赖项并重构它的方式。
这里的主要问题是理解为什么你的服务需要所有这些依赖项,
In 面向对象编程 http://en.wikipedia.org/wiki/Single_responsibility_principle, the 单一责任原则 http://en.wikipedia.org/wiki/Single_responsibility_principle指出每个上下文(类、函数、变量等)都应该
定义单一责任,并且该责任应该是
完全被上下文所封装。它的所有服务都应该是
与该责任紧密一致。
资料来源:维基百科
根据这个定义,我认为你应该分开你的UserService
进入处理的服务only one各负其责。
- 例如,获取用户并将其保存到数据库的服务
- 例如,另一个管理角色的服务
- ... 等等
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)