簡體   English   中英

Repository 和 Service 層的區別

[英]Difference between Repository and Service layer

我查看了一些相關的問題,但我仍然沒有看到存儲庫和服務層之間的太大區別。 所以給出這個例子,我想它應該是這樣的,如果不是,請告訴我為什么?

public interface ProductRepository extends CrudRepository<Product, Long>{

    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

public interface ProductService {

    public List<Product> findAll();
    public Product findById(Long id);
    public Product save(Product product);
    public void delete(Product product);
    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

而 ProductService 的實現將使用 ProductRepository 來實現這些方法。 正如我從http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html了解到的,對存儲庫中方法的查詢是自動生成的。 在我的示例中,這些方法在存儲庫和服務中重復,所以請解釋什么/為什么需要更改?

您所有的業務邏輯都應該在服務層中。

對數據庫(任何存儲)的任何訪問都應轉到存儲庫層。

讓我們舉個例子。 你必須保存一個實體(人)。 但是在保存 Person 之前,您要確保 Person 的名字不存在。

所以驗證部分應該去業務層。

在服務層

PersonRepository repository; 
public Person save(Person p){
   Person p = findByName(p.getName();
   if (p != null){
          return some customException();
   }
   return repository.save(p); 
}

public Person findByName(String name){
     return repository.findByName(name);
}

在您的存儲庫層中,只需專注於數據庫操作。

您可以自己在 Repository Layer 中完成此操作。 假設你已經在你的 Repository 中實現了這個,那么你的 save 方法總是在保存之前檢查(有時你可能不需要這樣做)。

存儲庫層為您提供了對數據訪問的額外抽象級別。 存儲庫層公開基本的 CRUD 操作。

服務層暴露業務邏輯,使用存儲庫。

您可以在此處閱讀更詳細的答案: https : //stackoverflow.com/a/5049454/1446006

存儲庫是一種數據訪問模式,其中數據傳輸對象被傳遞到管理 CRUD 操作的存儲庫對象。 這種模式在您的數據訪問機制可能發生重大變化的情況下很有用——例如,您希望在一個實現中擁有不同的數據存儲,如 Oracle 和 SQL Server 甚至 HADOOP 在另一個實現中。

服務層是 SaaS 架構中常用的業務邏輯模式。 使用服務層允許一個或多個表示實現通過公共接口訪問您的業務邏輯。 例如,如果您希望您的網站有一個 API,您可以使用服務層來實現網站和 API 都將使用的通用后端功能。

前者主要關注數據訪問,后者關注業務邏輯。 兩者都不是強制性的,也不是必須伴隨另一個。 在簡單的應用程序中,兩種模式都可以由同一個類實現。

據我所知,Repository 是用來直接訪問數據庫的。 這是直接調用存儲過程或任何數據存儲機制的地方。

服務層是數據的 API。 您通常會聽到一些邏輯級別,或者在服務和存儲庫之間的另一個抽象層中。

例如,網站會調用您的服務中的方法。 您的服務會調用您的存儲庫來獲取該數據,然后您的服務會以某種方式對其進行轉換(構建對象、根據業務規則生成動態信息等),然后將其傳回網站。

在這種情況下,您似乎正在使用 Spring Data,其中存儲庫充當 DAO(它們定義可用的數據庫操作,並且這些方法的實現由框架生成)。 服務層應該位於存儲庫之上,即它通過存儲庫訪問數據。

其他答案沒有指出您可能不需要服務層:如果您的實現看起來很簡單(僅將實體傳遞給控制器​​而不進行任何處理),那么服務層可能是您的應用程序中不必要的抽象級別。 您應該只在具有某種目的時創建服務層。

簡單地說,我將舉一個實際的例子.. 就像你有 2 個數據源,一個來自本地數據庫,另一個來自 web api。 因此,存儲庫應該為您管理它,詢問本地數據(您是否存在?測試從其服務中獲取它,如果不是服務,請從 api 獲取數據......

因此,我們將有 2 個服務(水流)將數據傳送到(存儲庫)。

暫無
暫無

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

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