扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
我有幸参与了一个基于三层架构的ASP.NET的项目,也有了些心得,下面就开发过程中遇到的一些问题谈谈自己的一点看法。以下是架构图:
一、数据实体层(Entity)的实现
我们首先需要解决的是数据的表示方式的问题,在VB开发中,相信大家都遇到过如何有效的构造数据实体的问题,单个类,集合类,集合类中如何操作单个类,如何用填充数据实体,这些问题解决起来都不是很容易,也有很多方法来实现,对于集合类的实现,可以用数组,可以用集合对象,也可以用字典对象,当然实例化数据实体也有很多方法,象最常见的工厂模式,这里就不讨论了,我在项目中是用TYPED-DATASET对象来作为数据实体,个人觉得有以下好处:
1. 数据绑定。可以直接和控件绑定,尤其是网格控件,在VB中是很困难的,除非增加个属性来存放Recordset,这样一来又要多增加方法来初始化Recordset,并且增加了实例化和封送处理的成本
2. 代码自动生成。少写很多代码,尤其是当表中字段很多的时候,并且自动提供了序列化功能
3. 集合类。Typed-Dataset本身就是个集合类,提供添加,删除,修改,查找单个类的方法
当然也有缺点,任何事物都无法十全十美,比如很难从中派生出子类,实例化成本高等。
在自动生成Typed-Dataset时,需要做些改动使Entity更好的符合OO的特性
A、自动生成的表对象和行对象是以DataTable和Row结尾的,这可以通过加如以下代码来更改:在XML文件中的<xml:schema 节点加入:
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:codegen="urn:schemas-microsoft-com:xml-msprop" 命名空间
B、重写 <xs:choice maxOccurs="unbounded"> 节点后的<xs:element name="Tables”> 节点 <xs:element name="Tables" codegen:typedName="Table" codegen:typedPlural="Tables">
C、由于自动生成的代码遇到某个字段为NULL时默认是报错,如想不报错,需在每个Element节点定义中加入: nillable="true" codegen:nullValue="_null" 或nillable="true" codegen:nullValue="false" 或nillable="true" codegen:nullValue="1900-01-01T00:00:00"
D、Entity的粒度。在考虑实体对象的设计时,“对象的粒度”是一个需要仔细考虑的问题,个人喜欢粗粒度的Entity,这样可以减少与数据库的往返次数,当然也不是包含所有的表,这样效率不高,比如Order,只需要Order 和OrderDetail 表,Product,SalesPerson就不需要了,当然也可以用从dataset继承的自定义类来作为Entity,但个人觉得一般情况下没必要,毕竟MS的typed-dataset功能更多,而且实现起来也比较复杂。
二、 数据服务层的实现(Data Service)
使用MS的Data Access Application Block,效果还可以,大家可以到MS站点下载。
三、数据访问层(Data Access)
所有的数据操作采用传统的存储过程(SP)实现的,但由于Entity是个集合,包含多行,因此要循环调用SP以实现批量操作,个人建议提供两个方法,一个是操作一行(常用),一个是操作多行(不常用)。
四、业务层(Business Logics)
需要完成的功能是各种业务规则和逻辑的实现,从SevicedComponent继承,这是界面层唯一需要清楚了解的层,也是以后系统扩展和经常需要变更的地方,因此业务层的每个模块都有个基类,Module1BaseClass,例如单据模块,结构如下:
Abstract Class OrderBase Public Function AddNew() Public Function Delete Public Function GetOrderByID Public Function Update End class Public Class SaleOrder Inherits OrderBase …………… End Class Public Class PurchaseOrder Inherits OrderBase ……… End Class Public Class MorePurchaseOrder Inherits PurchaseOrder ……… End Class |
这样一来业务层的扩展性就强了,这就是OO的好处啊,如果在VB中,就很难实现了,当然通过Interface也可以间接的实现,但不方便,毕竟VB6不是面向OO的语言,是面向Interface的。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者