一個簡單的菜單管理,我卻迷茫了,求解惑

一、需求
做一個簡單的CMS,關於菜單部分的需求。
系統管理員輸入賬號密碼登陸後臺系統後,首頁面顯示佈局爲:頂部水平顯示一行導航菜單,左邊欄顯示樹形菜單,點擊不同的導航菜單,左邊欄顯示不同的樹形菜單。中間是工作區。
系統管理員在導航菜單中點擊菜單管理,左邊欄顯示:

導航菜單
|——所有導航菜單
|——添加導航菜單
樹形菜單
|——所有樹形菜單
|——添加樹形菜單

點擊添加樹形菜單,工作區彈出添加頁面,從上到下要求包括:

所屬導航菜單(點擊下拉列表,必填)
父菜單(點擊下來列表,可以不選表示沒有父菜單)
菜單名(必填,必須中文,2-8字,不能與現有樹形菜單同名)
url(必填)
排序(整數型,必填)

提交後,要驗證導航菜單和父菜單是否存在。
其他更詳細的描述略之。

二、需求分析(場景在前面有描述,下面有所省略,主要圍繞添加樹形菜單)
1.業務建模
(a)業務用例:管理菜單
2.用例分析
用例:管理菜單
業務活動:添加樹形菜單,修改樹形菜單,刪除樹形菜單,查詢所有樹形菜單,查詢所有導航菜單,根據菜單名查詢導航菜單,根據菜單名查詢樹形菜單
3.系統建模
用例:把上者的業務活動的節點作爲一個系統用例
用例關係:菜單管理include(添加樹形菜單include(查詢所有導航菜單,查詢所有樹形菜單,根據名字查詢導航菜單,根據名字查詢樹形菜單))
系統架構:B/S,REST,MVC...
系統範圍:...
...

三、概要設計
1.領域模型:導航菜單,樹形菜單
2.包+類:
menu
|—controller
| |—TreeMenuController.class
|—service
| |—MenuManager.class
|—dao
| |—TreeMenuDAO.class
| |—NavMenuDAO.class
|—entity
|—TreeMenu.class
|—NavMenu.class

PS:1.原諒我用貧血模型 2.po和dto幾乎一樣,用entity算了


3.領域類:NavMenu,TreeMenu
4.領域類關係:NavMenu(1) —關聯— (n)TreeMenu 樹形菜單中 父菜單(1) —父子— (n)子菜單
5.類圖:...
...

四、困惑
說困惑之前說說我的想法。
1.因爲TreeMenu需要依賴NavMenu,所以模塊劃分的時候,抽象一個層次爲Menu
2.同樣考慮,抽象爲MenuManager來做服務接口。
3.MenuManager依賴DAO接口,不依賴具體實現,具體實現類通過外部框架進行注入,從代碼層面上解耦。
困惑來了。
1.採取的是貧血模型,如果我要用充血模型,請問怎麼做?我嘗試過,可是感覺失敗了。我自己的做法是:
menu
|—application
| |—TreeMenuController.class
| |—TreeMenuVO
| |—NavMenuVO
| |—NavMenuService.class
| |—TreeMenuService.class
| |—impl
| |—TreeMenuServiceImpl.class
| |—NavMenuServiceImpl.class
|—domain
| |—NavMenu.class
| |—NavMenuRepository.class
| |—TreeMenu.class
| |—TreeMenuRepository.class
|—infrastructure
|—NavMenuDAO.class
|—TreeMenuDAO.class
|—NavMenuPO.class
|—TreeMenuPO.class
|—TreeMenuAssembler.class
|—NavMenuAssembler.class
|—impl
|—NavMenuDAOImpl.class
|—TreeMenuDAOImpl.class

幾點說明:TreeMenuVO、NavMenuVO是DTO,TreeMenuPO、NavMenuPO是持久化對象,他們都由TreeMenuAssembler和NavMenuAssembler負責組裝,po數據從數據庫查出來,然後將數據裝配到domain裏,最後繼續裝配到vo裏。反之亦然。

依賴關係:controller——>service——>repository——>dao

這麼下來後感覺怪怪的,多了好多類,不知道這樣算不算DDD。算不算領域模型驅動。囧。望朋友能夠指正。

2.對於TreeMenuService來說,它有個操作,添加樹形菜單,需要去查詢獲取所有的導航菜單,那麼這個查詢操作屬於NavMenuService的職責嗎?當然,它一定屬於NavMenuDomainObject的。假設它也屬於NavMenuService的方法,那麼我想問,TreeMenuServie可以調用NavMenuService的方法嗎?或者我是否改抽象出一個MenuService來?

補充:service主要作爲事務邊界和代理domain面向用戶的接口,在其內部非簡單代理domain的邏輯方法裏,負責對多個domain的操作邏輯。而domain內部也有邏輯,但是這種邏輯僅與當前所在domain實例有關,不能與多個domain有關,如果是多個有關的話,應該要封裝在service中。
系統的dao,service都要面向接口編程,由外部框架進行依賴的注入。
系統應該是按模塊來進行包的組織。模塊之間不能有任何的依賴,只能依賴公共組件。任何模塊單獨拿出來都能獨立運行。
前面說的menu就是一個模塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章