當涉及到訪問數據庫的應用程序(通過Hibernate)時,我一直在試圖改善問題的分離。訪問數據庫時關注問題的最佳實踐
在我一直在使用下面的方法的應用程序之一:
- 創建具有數據庫的無連接/意識和業務邏輯。他們只與GeneralDAO(和其他服務)通信;
- GeneralDAO負責CRUD /查找操作以及涉及更復雜數據庫查詢的方法。
我用這種方法看到的問題是:
- GeneralDAO慢慢地變成上帝的對象,當你的應用程序的增長,並需要大量的特定數據庫的查詢。
- 有時更具體的服務只能成爲GeneralDAO的代理,因爲該方法很簡單,只需要數據庫查詢。見例1
例1:服務就是
bookService的管理在圖書館應用相關的書籍東西代理。讓我們考慮兩種方法:
- archiveBook(書)
- findByIsbn(字符串ISBN)
在archiveBook(Book)
可能有相當多的商業邏輯有關 - 我們可以想像這涉及到呼叫:
distributionService.unbox(Book);
archivalBook.archive(Book);
librarianService.informNewBook(Book);
但是findByIsbn(String isbn)
更簡單:它只需要對數據庫執行SQL調用。因此,在這種情況下,我看到兩個選項:
- 重定向調用的對象,可以將數據庫說話來執行查詢。例如generalDAO.findByIsbn(String isbn),它使用數據庫通信層(在Hibernate中它會使用sessionFactory或EntityManager)來執行查詢。
- 作出這樣的數據庫層提供給bookService的,使得它執行查詢本身
問題/意見(第一號標識上面的選項):
1.1。擁有2個完全相同簽名的方法並不奇怪,即使這樣做是爲了使BookService獨立於數據庫層(和ORM)嗎?
1.2。你如何建議避免上帝的反模式?你會建議根據這些方法做什麼把GeneralDAO分成幾個DAO?在這種情況下,我們是不是冒着需要向某些服務注入大量DAO的風險,導致服務中注入了太多對象?
2.1您對這種選擇有什麼看法?它不是通過讓BookService知道兩個不同抽象級別的對象(DAO和sessionFactory/EntityManager)來打破「關注點分離」嗎?
3.1。你會建議任何其他方法/模式/最佳實踐嗎?
謝謝!
現在,我確信我們應該從DAO中刪除任何數據庫業務知識。 DAO應該完成它所要做的事情,並且它會對數據庫運行查詢。它很容易配置它們自己做Crud sql,但任何查詢beyong應該由業務層使用知道如何構建查詢的對象來處理。這樣你的daos中就沒有business-sql。在我的工作中,我有很多這樣的人,他們很痛苦,更不用說業務層,大部分時間,只是將控制權交給DAO,而不是自己做的工作。 – Dalton