表模块模式简介
其实我觉得写博文也可以跟写小说一样,有连载,只要读得顺畅就好,我并不想通过几篇博文读下来,就让读者成为某个方面的专家。
在每写一篇短短的博文,都曾参考过很多有价值的书籍和其他人的博文,所以不可能把所有的东西都写进来的。
我最近在思考的时候,经常茶不思饭不想,不知道的人看来,以为我会是得了相思病的少年。
上集回顾
在上几篇业务层的设计都描述的是领域模型的模式,为了解释领域模型的使用,我居然提前写了一点数据访问层。
领域模型适合业务逻辑比较复杂,业务规则繁多,因为这些复杂的元素都会被内聚在领域模型之中,而领域模型又可以被重用。
这样一来就能避免许多业务逻辑的重复分布在各个地方,对维护带来说,这是非常有爱的。
但是在需求和设计阶段,需要花费很多时间,但是你会发现领域模型重用了几次之后,就会体会到它的好处。
初学者不要轻易尝试,尤其是半路出家的程序员。
所以接下来打算介绍一些比较简单的模式,表模块模式和事务脚本模式。
我会对表模块做一个比较简单的描述,就是比较简单,因为我不是很喜欢它。
相对而言,实践中事务脚本我用的还算比较有心得,打算在后续的博文中慢慢介绍。
表模块(Table Module)
先来宏观地看一下操作流程:
通过创建一个DataSet数据集,添加一个表,轻松构建一个强类型的DataSet
可以为它添加一个查询
非常轻松,VS将自动生成查询SQL,但是SQL语句无法太复杂,不能超出VS的识别范围。
调用方法:
可以看到它返回的是一个强类型的DataTable,使用起来非常方便,但是当你实战中用的时候,会发现问题的,比如你有一个备注字段是Null,试试看吧,至少在.NET2.0中就悲剧了。
表数据网关模式:
用代码直观地表示:
在数据网关中执行SQL命令返回想要的数据集,然后在业务类中处理,得到想要的结果。
业务类
PPDataSet.PP_VIRTUALSENDCONTROLDataTable _table=null; public VirtualSendControlManager() { } public VirtualSendControlManager(PPDataSet.PP_VIRTUALSENDCONTROLDataTable table) { _table = table; } public PPDataSet.PP_VIRTUALSENDCONTROLRow GetRow(int index) { if (_table.Rows.Count == 0) { return null; } return _table.Rows[index] as PPDataSet.PP_VIRTUALSENDCONTROLRow; }
小结:
VS生成的强类型的DataTable给我们带来很多便利,它可以是某个表,也可以是视图。
只不过使用中它还是会有一些问题的,比如之前提到的null的问题,不知道是不是一个bug。
如果不使用VS生成的强类型数据集,那么表模块就失去了自己的优势,尤其是业务对象和数据库表结构差异较大的情况下。
如果要实现自定义的强类型数据集,可以参考微软的源码,然后自行设计,不过工作量受不了啊。
表模块模式是一个搞毕业设计的利器(邪恶的想法)。