2012-03-09 284 views
26

我的web應用程序是使用Spring MVC + Hibernate編寫的。我真的需要服務層嗎?

  • 我的模型是「客戶」實體POJO。
  • 我有一個DAO對象「CustomerDAO」,它的方法「saveCustomer(c)」包含與Hibernate交互的代碼;
  • 然後,我創建了一個「的CustomerService用‘saveCustomer(三)’方法誰簡單地將客戶對象到DAO保存;
  • 最後還有‘CustomerController’和customer.jsp,誰負責視圖層,JSP的表單域綁定到控制器端Customer對象,控制器調用服務。

我看到了很多的應用程序都遵循這個(最好的)的做法,但我不知道爲什麼我將需要一個服務層

也許它是有用的解耦p urpose:我可以向控制器顯示一個通用外觀,並注入HibernateDAO,GaeDAO,MyDAO等服務....但是我也可以在沒有該服務的情況下執行此操作:使用接口。

我也想:驗證。我將在服務中進行我的客戶驗證,但是......在Spring控制器中驗證要方便得多。

請幫我理解這個概念:)

回答

22

標註在服務層的方法,有一個交易跨越多個數據庫操作你不需要服務層。但是它可以幫助你

  • 解耦組件
  • 您可以強制在服務層的具體業務規則應該是不可知的資源庫
  • 讓服務門面的一個或多個存儲庫。讓我們看看下面的示例
class Service { 
    private DatabaseBarRepo barRepo; 
    private DatabaseFooRepo fooRepo; 

    @Transactional 
    public void serviceRoutine() { 
    barRepo.doStuff(); 
    fooRepo.doStuff(); 
    } 
} 

在這裏,我們讓兩個獨立庫採取的同一交易的一部分。這對於數據庫是特定的,儘管這些原則對其他系統也是有效的。

+1

該服務還可以提供共享邏輯到一個測試服務層(業務代碼)或更多的控制器(例如Web控制器和JSON/WS API) – seanhodges 2012-03-09 11:55:24

+4

您也可以通過這種方式輕鬆地將服務(服務方法)作爲Web服務公開... – 2012-03-09 12:04:49

+0

@seanhodges,matjaz,是的確 - 優秀的建議 – 2012-03-09 12:11:24

2

還有其他的東西,你在服務層。有時它會在將任何操作傳遞給DAO之前應用業務規則。有時一個服務需要與其他服務交互,DAO需要遵守業務規則。

告訴我們你將如何在沒有服務器層和界面的情況下完成高層次的想法,這會幫助我更多地告訴你。

6

現在,你的服務層是微不足道的,因爲你的服務是數據庫訪問的簡單包裝。這是所有的應用程序?如果不是這樣,當你開始構建不重要的部分時,你的服務層將會擴展。

6

您可以通過具有所有CRUD操作的BaseService來保存詳細信息,並將其委託給注入其中的BaseDAO。

除了CRUD之外,幾乎所有其他東西都有獨立的邏輯,用於業務邏輯和數據庫特定的操作。而另一件事 - 你可以通過@Transactional

21

關鍵是交易行爲。如果你沒有服務層,你會在哪裏劃分交易?

    在表示層
  • :這不是地方事務劃分屬於,你將無法使用聲明式事務劃分
  • 在DAO層:你就不能創建一個客戶和它的接觸(例如)在一個單一的交易,因爲它會使用兩種不同的DAO

而且,你希望你的UI層儘可能簡單,業務代碼(有時比sinply調用DAO複雜得多方法)在特定組分中分離。這允許

  • 單元測試UI層由嘲笑服務層
  • 單元通過嘲笑DAO層
+2

+1 * domain facade *風格的服務層對於域模型來說是一個很薄的外觀,不是實現任何業務邏輯本身,而是指出事務。使用EJB(而不是Spring)時更明顯,其中無狀態會話Bean具有容器管理事務。 – Raedwald 2012-03-10 17:11:35