簡體   English   中英

使用Spring從控制器層調用存儲庫和服務

[英]Call repository and service from controller layer with Spring

我使用Spring Boot和Spring Data。

我不介意將存儲庫層和服務層分開

所以我有我的UserRepository和CRUD方法以及一些Spring Data方法

  • 找到所有
  • findByUsername

我也有UserService和業務方法。

  • checkPassword(字符串登錄,字符串密碼)
  • businessMethodAction(String username)

這是我的問題:

在我的控制器中,我必須從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應用程序,我認為只要應用程序簡單,小,控制器就可以了解存儲庫並直接調用它進行簡單的讀取操作

權衡:

  • 調用repo的控制器刪除了服務層的抽象層
  • 控制器和存儲庫現在耦合在一起
  • 如果您的讀操作沒有要求/用例/業務邏輯,我建議不要推出完整的服務。 YAGNI(你不需要它)。 這意味着,考慮到業務需求,在此時實現額外的“傳遞”服務層是沒有意義的。
  • 在您選擇讓控制器知道您的存儲庫之前,我建議您考慮是否已將存儲庫層與持久層分離。

controller -> service -> repository -> persistence結構不是一個硬性規則,而不是controller -> repository -> persistence 你的用例似乎適合后者。

一種方法是保留控制器,用於在DB的規范化實體的視圖和存儲庫上顯示的業務級概念。 然后,可以定義服務以解決控制器和存儲庫之間的多對多關系。

如果您使用的是彈簧啟動,則正確的注釋是@Autowired ,而不是@Inject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM