正如我已經幾次面臨這個問題沒有很好地解決REST API建設者:REST API設計查詢
擁有它似乎很清楚一個實體組織,我們可以休息型號爲/組織,所有的包(GET,POSt,PUT,DELETE,過濾,分頁,...)
請注意,我使用Spring將@RestController類和spring-data PagingAndSortingRepository注入到控制器中。
的問題
/組織/(編號)開始/用戶
這是一個REST API一個完美的URL,但開始引起一些疼痛。
如果我們按照在組織控制器中處理請求的路徑,我們需要將UserDAO添加到控制器,所以我們可以在每個控制器中注入很多DAOS並且每個控制器都負責返回許多不同的對象:組織,用戶,型號等
將問題推到DAO層不是解決方案;試圖使存儲庫返回所有這些不同的對象將不起作用(PagingAndSortingRepository應該抱怨,如果我們試圖與不同的實體一起工作),並且它感覺不到正確的事情,因爲我們強制存儲庫與其領域之外的實體一起工作。
在控制器和DAO之間使用中間層可以工作,一個服務層可以容納這些不同的DAO並提供一個外觀,但又會感覺錯誤:首先,控制器仍在處理許多不屬於它的對象其次,我們有一個沒有真正目的的圖層,可以使用DAO的組合來增長,或者擁有一個可以查詢任何東西的偉大的主DAO對象。
解決這個問題的好方法是什麼?
mmm ...不確定理解,因爲你在最後注入了兩個DAO ......但我想也許你的建議是使用通用DAO的泛型控制器和一個機制來確定具體需要哪些DAO請求,並將在運行時實例化具有特定DAO的特定控制器以提供該特定請求。這是它嗎? – Rafael
@Rafael你錯過了。首先沒有通用控制器 - 只是你的常規控制器。其次,沒有DAO被注入,它們只是在Spring中被創建爲bean,但沒有被注入到任何地方。但是你有一個工廠可以保存對它們的引用 - 每個bean都將自己放入工廠地圖的構造函數中。然後在您的控制器運行時,您可以通過工廠獲得任何DAO –