[Architecture Pattern] 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集合。
期許自己~
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。