[Architecture] Lazy Boundary

[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集合。

 

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。