2009-07-03 63 views
5

讓我們假設一個簡單的Spring MVC控制器,它接收一個域對象的ID。控制器應該調用一個服務,該服務應該對該域對象做些什麼。Spring MVC域對象處理最佳實踐

從哪裏可以將域對象的ID從數據庫中加載到域對象中?這不應該由控制器完成。所以服務方法接口必須使用接受域對象ID而不是域對象本身。但是,如果將域對象作爲參數,服務的接口會更好。

對這個常見用例有什麼想法?你如何解決這個問題?

在我的一個項目

回答

4

控制器應該將id傳遞給服務層,然後返回所需的任何內容來呈現剩餘的HTTP響應。

所以 -

Map<String,Object> doGet (@RequestParam("id") int id) { 
    return serviceLayer.getStuffByDomainObjectId(id); 
} 

別的只是將被污染的網絡層,這不應該關心的所有關於持久性。服務層的全部目的是獲取域對象並告訴他們執行其業務邏輯。因此,數據庫調用應該駐留在服務層本身 -

public Map<String,Object> getStuffByDomainObjectId(int id) { 
    DomainObject domainObject = dao.getDomainObjectById(id); 
    domainObject.businessLogicMethod(); 
    return domainObject.map(); 
} 
2

我使用的服務層:

class ProductService { 

    void removeById(long id); 

} 
2

我認爲這將取決於服務是否是遠程或本地。通常我會盡可能將ID傳遞給遠程服務,但首選本地對象。

其原因在於,它只通過發送絕對必要的遠程服務來減少網絡流量,並阻止對本地服務的多個DAO調用(儘管使用Hibernate緩存可能是本地服務的一個靜音點)。

+0

尼克,這是「有爭議的問題」 :-) – anton1980 2012-07-21 05:04:44