[英]Call repository and service from controller layer with Spring
我使用Spring Boot和Spring Data。
我不介意將存儲庫層和服務層分開
所以我有我的UserRepository和CRUD方法以及一些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);
}
你怎么看?
控制器層不應該直接調用存儲庫。 您應該始終使用服務層,因為服務層封裝了圍繞該調用的業務邏輯。 僅僅因為目前沒有任何業務邏輯,並不意味着你應該完全跳過該層。
在我看來,服務層必須實現業務邏輯,並且必須從控制器調用它。 在大多數情況下,除了從DAO對象調用方法之外,該層必須執行更多操作。 如果您的應用程序具有很大的尺寸,這可能是最佳解決方案 此外,您可以將邏輯分成幾個部分並使其在一個事務中工作,這有助於您將數據保存在無爭議狀態。
如果您的控制器不需要業務邏輯或執行單個存儲庫操作,則可以直接使用存儲庫。 使用服務來實現需要業務邏輯或存儲庫調用編排的用例。
如果它是一個分層的CRUD應用程序,我認為只要應用程序簡單,小,控制器就可以了解存儲庫並直接調用它進行簡單的讀取操作
權衡:
controller -> service -> repository -> persistence
結構不是一個硬性規則,而不是controller -> repository -> persistence
。 你的用例似乎適合后者。
一種方法是保留控制器,用於在DB的規范化實體的視圖和存儲庫上顯示的業務級概念。 然后,可以定義服務以解決控制器和存儲庫之間的多對多關系。
如果您使用的是彈簧啟動,則正確的注釋是@Autowired
,而不是@Inject
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.