[Architecture] : Lazy Boundary
動機 :
在設計物件導向應用程式架構的時候,關聯的物件進出 Data Access Layer(DAL)是一件很複雜的事情。
Entity Framework是一種解決方案的選擇,但是它包裝了太多用不習慣的功能。
例如物件的變更追蹤同步這類的功能,一般開發程式的時候主要是新增修改刪除查詢,很少去處理到追蹤同步。
本文介紹一個輕量級的邊界模式,將它架構在Business Logic Layer(BLL)裡。
讓DAL層,只專注處理永續儲存的資料。
讓BLL層,能簡單處理物件與物件關聯,方便建立不貧血的物件。
結構 :
參與者 :
User
- 被關聯的物件,UserID是這個物件的索引值。
UserGroup
- 包含UserID的集合。
IUserRepository
- DAL層實作的介面。
- 負責User物件的新增、修改、刪除、查詢。
IUserGroupRepository
- DAL層實作的介面。
- 負責UserGroup物件的新增、修改、刪除、查詢。
- (不負責UserGroupEntity的進出)。
BoundaryContext
- DAL介面實作注入。
- 使用UserGroup當作參數,生成UserGroupEntity。
UserGroupEntity
- 關聯物件的延遲載入。
- 使用IUserRepository載入User。
- 關聯物件相關函式。(例如使用者群組內是否包含某個住址的使用者)。
實作 :
1. 新增、修改、刪除、查詢
- 直接建立UserGroup或是通過BoundaryContext.IUserGroupRepository查詢UserGroup。
- 通過BoundaryContext.IUserGroupRepository做新增、修改、刪除。
2. 針對UserGroupEntity內的User做邏輯運算
- 直接建立UserGroup或是通過BoundaryContext.IUserGroupRepository取得UserGroup。
- 再通過BoundaryContext.IUserGroupRepository取得UserGroupEntity。
- UserGroupEntity使用IUserRepository載入User,並對User做邏輯運算。
* UserGroupEntity也可以通過BoundaryContext.IUserGroupRepository做新增、修改、刪除。
範例程式 :
檔案下載 : CLK.LazyBoundarySample.rar
*範例程式簡單示範整體的運作,主要是將DAL的工作簡化。
- 如果DAL直接建立UserGroupEntity,那在DAL裡面就需要有IUserRepository的參考。
*範例程式有些功能沒有實做
- 例如 : UserGroup基於效能,一次只延遲載入一個User。
- 例如 : 修改UserGroup的UserID列表後,重整延遲載入User集合。
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。