免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
仓储模式的实现仓储Repository模式已经成为最主流的模式,数据库持久化很长时间以来是一个讨论热点,目前主要问题是:主流软件并不容易有效地将需要存储的数据映射到外部存储空间如关系数据库或NoSQL数据库。技术难点虽然已经被一些ORM工具如Hibernate等解决了,过去,我们通常使用DAO或ORM来进行业务对象和持久化数据表之间进行转换,这些技术很好,但是他们还是属于底层技术,并不能透明地和我们统一语言整合。下面的问题是如何将持久化动作和对象获取方式以及领域模型Domain Model结合起来,更进一步地说:如何更加统一我们的语言(Ubiquitous Language)(不至于出现Hibernate等底层技术语言,统一为业务语言)。一个整合持久化技术的好办法是仓储Repositories,在Evans书籍中定义它是:一种机制,用于封装存储 获取 搜寻一群对象集合等行为。这个定义很容易向领域专家解释,整合到统一语言中。第一:命名一般人仓储类如下命名:class OrderRepository List getOrdersFor(Account a).而Rodrigo Yoshima 认为应该如下取名:class AllOrders List belongingTo(Account a).似乎是一个小的改变,但是有帮助得多,如果两个仓储包含不属于他们的方法,我们如何分辨他们呢?/classic naming styleclass UserRepository User retrieveUserByLogin(String login). void submitOrder(Order order).客户端调用代码:User u = userRepository.retrieveUserByLogin(“pcalcado”);userRepository.submitOrder(new Order();而Yoshima的取名方式如下:/Yoshimas naming styleclass AllUsers User withLogin(String login). void submitOrder(Order order). /client code /非常符合英语风格,象说话一样。User u = allusers.withLogin(“pcalcado”);allusers.submitOrder(new Order();一定要记住:你使用的语言方式会影响你如何思考。以retrieve或get为开始方法名是坏味道。第二:避免方法爆炸一个好的仓储将领域概念建模在其接口中,让我们看一个业务规则:每个订单在周末都要增加10%的附加费。如果我们要显示所有订单,如下:List surchargedOrders = allOrders.placed(user, IN_A_SATURDAY);surchargedOrders.addAll(allOrders.placed(user, IN_A_SUNDAY);return surchargedOrders;这虽然工作很好,但是忘记了抽象,增加附加费这个规则是不应该暴露给调用客户端的,如下会更好些:return allOrders.surchargedFor(user);为了实现这点,可能需要多个实体反复查询,你可以使用规格模式Specification来实现,如下:Specification surcharged = specifications.surcharged();return allOrders.thatAre(user, surchanged);如果我们要获取没有附加费或者有附加费的订单,需要两个仓储AllOrders 和 SurchargedOrders.如下:/returns all ordersreturn allOrders.from(user); /returns only orders with applied surchargereturn surchargedOrders.from(user);Subset Repositories子集仓储一般被建模成带有参数实例的仓储类,如下:/a base Repositoryclass Users private User.Status desiredStatus = null; public Users() this(User.Status.ANY); public Users(User.Status desiredStatus) this.desiredStatus= desiredStatus; /methods go here. /instantiated somewhere asprivate Users allUsers = new Users();private Users activeUsers = new Users(User.Status.ACTIVE);private Users inactiveUsers = new Users(User.Status.INACTIVE);第三:只有一个类型如下代码,虽然使用了好的命名规则public interface AllServices List belongingTo(List accounts); Service withNumber(String serviceNumber); List relatedTo(Service otherService); List allActiveProductsBelongingTo(List accounts); List allProductsBelongingTo(List accounts); ContractDetails retrieveContractDetails(String serviceNumber);方法返回了Service类型集合,还返回了Product集合,是多个集合,好的设计最好返回同一个类型集合:public interface AllServices List belongingTo(List accounts); Service withNumber(String serviceNumber); List relatedTo(Service otherService); public interface AllProducts List activeBelongingTo(List accounts); List belongingTo(List accounts); public interface AllContractDetails ContractDetails forServiceNumber(String serviceNumber);如果特别情形需要,你可以创建一个Wrapper类,将这些方法都放入其中,如下:public class BillingSystemGateway implements AllServices, AllProducts , AllContractDetails List belongingTo(List accounts). Service withNumber(String serviceNumber) . List relatedTo(Service otherService) . List activeBelongingTo(List accounts) . List belongingTo(List accounts) . ContractD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 游戏设计师游戏设计与更新实施效果绩效考核表
- 采购合同解决争议函(5篇)范文
- 城市智慧社区服务平台开发及推广解决方案
- IT运维人员服务器扩容操作手册
- 内科护理药物应用
- 2026广西玉林市第一人民医院住院医师规范化培训第四批招收3人笔试备考题库及答案详解
- 家庭教育亲子关系建设方案
- 儿科延伸护理的康复训练
- 呼吸系统疾病的护理持续改进
- 确认客户服务培训时间确认函(3篇)
- 要素式申请执行文书-强制执行申请书模版
- 台球厅员工手册
- 2025-2030中国重症监护医院资源配置与运营优化报告
- 《煤矿安全规程》2025版
- 风电场安全知识培训
- 供应商安全培训记录课件
- 防爆电气基础知识培训课件
- 2025年山东省潍坊市中考英语真题(解析版)
- 生产排产计划讲解
- 药品窜货管理办法
- 2024版电网典型设计10kV配电站房分册
评论
0/150
提交评论