个人版机房时,D层所有返回值不是DataSet,就是Integer,没有返回实体的函数。机房合作版,我写D层,庞凡(组长)设计的每个类中几乎都有几个函数是返回实体的。我研究了一番,在D层每个类中都定义了一个“数据集DataSet转换为实体”的函数DataSetToModel(参数),这样的话,该类中每个需要返回实体的函数都可以调用这个函数,这就实现了代码复用。
(注:之所以定义这个函数,是因为我的SqlHelper中的所有函数的返回值 只有两种——DataSet、Integer,D层返回实体的函数,在调用SqlHelper中返回DataSet类型函数后,还需将DataSet转换为实体)
(注:这篇博客不是重点,介绍完这个函数,咱们再来分析一下它的缺陷,以及如何解决,如何做才能达到更好的效果,才能使代码复用性更高)
例子:(代码只写D层)机房收费系统为例
管理员打开“基本数据设定”窗体,窗体加载显示最新设置的基本数据(从数据库基本信息表T_BasicDataInfo中查询获得)
得到基本数据信息——ChecBasicDataInfo(参数)函数——返回值:基本数据信息的实体
将DataSet转换为基本数据信息实体——DataSetToModel(参数)函数——返回值:基本数据信息的实体
- ''' <summary>
- ''' 获得基本数据信息实体
- ''' </summary>
- ''' <param name="row">数据表第一列</param>
- ''' <returns>基本数据信息实体</returns>
- ''' <remarks></remarks>
- Public Function DataSetToModel(ByVal row As DataRow) As BasicDataInfoEntity Implements IDAL.IBasicDataInfoDAL.DataSetToModel
- Dim enBasicDataInfo As New Entity.BasicDataInfoEntity '创建基本数据信息实体
- If Not IsNothing(row) Then
- '1,如果“固定用户半小时费用”列存在
- If row.Table.Columns.Contains("FixHalfCash") Then
- If Not IsNothing(row("FixHalfCash")) Then '如果固定用户半小时费用列不为空
- enBasicDataInfo.FixHalfCash = row("FixHalfCash").ToString() '固定用户半小时费用
- End If
- End If
- '2,如果“临时用户半小时费用”列存在
- If row.Table.Columns.Contains("TempHalfCash") Then
- If Not IsNothing(row("TempHalfCash")) Then '如果临时用户半小时费用列不为空
- enBasicDataInfo.TempHalfCash = row("TempHalfCash").ToString() '临时用户半小时费用
- End If
- End If
- '3,如果“单位递增时间”列存在
- If row.Table.Columns.Contains("IncreasingUnitTime") Then
- If Not IsNothing(row("IncreasingUnitTime")) Then '如果单位递增时间列不为空
- enBasicDataInfo.IncreasingUnitTime = row("IncreasingUnitTime").ToString() '单位递增时间
- End If
- End If
- '4,如果“准备时间”列存在
- If row.Table.Columns.Contains("PrepareTime") Then
- If Not IsNothing(row("PrepareTime")) Then '准备时间列不为空
- enBasicDataInfo.PrepareTime = row("PrepareTime").ToString() '准备时间
- End If
- End If
- '5,如果“最少金额”列存在
- If row.Table.Columns.Contains("LeastBalance") Then
- If Not IsNothing(row("LeastBalance")) Then '最少金额列不为空
- enBasicDataInfo.LeastBalance = row("leastBalance").ToString() '最少金额
- End If
- End If
- '6,如果“用户类型”列存在
- If row.Table.Columns.Contains("DivideCash") Then
- If Not IsNothing(row("DivideCash")) Then '判断用户类型列不为空
- enBasicDataInfo.DivideCash = row("DivideCash").ToString() '判断用户类型字段
- End If
- End If
- End If
- Return enBasicDataInfo '返回基本数据信息实体
- End Function
代码解释:
B、U层调用,就可以获得基本数据信息啦:
思考问题:函数返回值为实体,这意味着什么?
意味着该函数的返回记录只能有一条,对不对?因为一个实体只能“保存”一条记录。
像查看某学生基本信息、某用户基本信息——某个人的基本信息只能有一条记录(学生实体:卡号、学号、姓名、…)吧,好,可有定义返回实体函数
思考问题: 但是,如果“根据日期查看所有收取金额记录”——不止一条记录吧,给你U层返回一个实体,能实现此功能吗?当然不能。
如何解决?
面对此问题,如何解决,你想过吗?——你说,返回DataSet或DataTable不就得了吗。你看,Out了吧….
偷偷告诉大家,还是返回实体,但是这次不是返回一个实体啦,是返回”一群“实体(实体集合)