我使用Spring Boot和Spring Data。
我认为分离存储库层和服务层
没有问题所以我有一个带有CRUD方法的UserRepository和一些Spring Data方法
我也有UserService和业务方法。
这是我的问题:
在我的控制器中,我必须从UserService调用方法,有时从UserRepository调用。目前,我在我的控制器中注入了两个,我称之为服务或存储库
@Inject
UserService userService;
@Inject
UserRepository userRepository;
@RequestMapping("{username}")
private void myMethod(@PathVariable String username){
return userRepository.findOne(username);
}
@RequestMapping("{username}/doBusineesAction")
private void myMethod(@PathVariable String username){
return userService.doLogicalThin(username);
}
我只是在问,因为我很困惑地注入两个并在同一个班级中调用一个或另一个
另一方面,这意味着要复制服务层中的方法,如此
public User findOne(String username){
return userRepository.findOne(username);
}
你有什么看法?
答案 0 :(得分:12)
控制器层不应该直接调用存储库。您应该始终使用服务层,因为服务层封装了围绕该调用的业务逻辑。仅仅因为目前不是任何业务逻辑,并不意味着您应该完全跳过该层。
答案 1 :(得分:1)
在我看来,服务层必须实现业务逻辑,并且必须从控制器调用它。在大多数情况下,除了从DAO对象调用方法之外,该层必须执行更多操作。如果您的应用程序具有很大的尺寸,这可能是最佳解决方案此外,您可以将逻辑分成几个部分并使其在一个事务中工作,这有助于您将数据保存在无争议状态。
答案 2 :(得分:1)
如果控制器不需要业务逻辑或执行单个存储库操作,则可以直接使用存储库。使用服务来实现需要业务逻辑或编排存储库调用的用例。
答案 3 :(得分:0)
如果您使用的是Spring Boot,则正确的注释应该是C:\Program Files\
,而不是@Autowired
。
答案 4 :(得分:0)
如果它是分层的CRUD应用程序,那么我认为控制器知道存储库并直接调用它以进行简单的读取操作就可以了,只要该应用程序简单,小
权衡:
与controller -> service -> repository -> persistence
相比,controller -> repository -> persistence
的结构不是一成不变的规则。您的用例似乎适合后者。
答案 5 :(得分:0)
一种方法是为数据库中标准化实体的视图和存储库上显示的业务级别概念保留控制器。然后,可以定义服务来解决控制器和存储库之间的多对多关系。