您的位置:首页 > 其它

走在机房重构的路上之泛型集合

2014-08-24 16:43 190 查看
在机房收费的重构版中,在D层根据已经相应的sql 语句或者存储过程,查出的数据有三种形式可以一层层的返回到U层:实体型、datatable型、泛型集合型。像之前设计模式的课上讲的,思考一个问题一个知识点,首先应该明确是什么,怎么用,什么时候用,用了有什么好处,不用又有什么影响。

首先,What?

所谓的实体型呢,就是在D层查出某一条数据后,对实体层实例化出一个变量名,将所得的数据中字段名一一对应的添加到实体层,这样一来,从D层查出数据到U层接收数据都是在各层中实例化实体,将数据一一返回;

从性质上来讲datatable和泛型集合差不多,都是承载不止一条数据的载体,用来临时存储数据,作为一个虚拟容器通过各层的传递将数据传送到U层,而为了降低耦合度我们都要选择泛型集合!为什么呢?datatable怎么就耦合高了呢?现在就拿基本数据设定窗体作为例子进行演示:



首先是D层:


然后是U层:




像图中框中显示的那样,我现在是要将查出的数据对应到U层每一个文本框中,那么我在D层开始对数据进行分割,而如果后期完善过程中数据库的字段名进行修改,这样一来数据量一旦增大,工作量也就自然而然上升,所以本着在快节奏的社会完好生存的理念,使用泛型集合。

泛型集合,我理解的就是一种虚拟数据存储空间,作为一种容器,将D层查询出来的数据直接存储在泛型集合中,这样在每一层都将泛型集合返回,下一层都直接调用泛型集合,即使数据库中的字段名发生变化D层的泛型集合部分也不用修改,因为是将查出的结果直接放在泛型集合中,所以应对数据库的变化不用做任何的改动。这样是不是就可以降低层与层之间的耦合度,坦然面对程序的各种大小变化呢?

既然泛型集合这么高大上那么究竟怎么用呢?下面一起来看代码:

Public Class DataToList

    Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)  '将datatable转化为泛型集合

        '注意:1,convertToList(Of T As {New}) 这里的new是用来约束T的,必须有,不然new T的时候会出现错误

        '2,new约束在C#和VB.NET里面的写法是不一样的,C#里面用的是where来为T加上约束的

        Dim myList As New List(Of T)   '定义最终返回的集合
        Dim myTpye As Type = GetType(T) '得到实体类的类型名
        Dim dr As DataRow   '定义行集
        Dim tempName As String = String.Empty   '定义一个临时变量

        '遍历DataTable的所有数据行
        For Each dr In dt.Rows
            Dim myT As New T    '定义一个实体类的对象
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()  '定义属性集合
            Dim Pr As PropertyInfo

            '遍历该对象的所有属性
            For Each Pr In propertys
                tempName = Pr.Name '将属性名称赋值给临时变量
                '检查DataTable是否包含此列(列名==对象的属性名) 
                If (dt.Columns.Contains(tempName)) Then     '将此属性与datatable里的列明比较,查看datatable是否包含此属性
                    '判断此属性是否有Setter
                    If (Pr.CanWrite = False) Then   '判断此属性是否可写,如果不可写,跳出本次循环
                        Continue For
                    End If
                    Dim value As Object = dr(tempName)  '定义一个对象型的变量来保存列的值
                    If (value.ToString <> DBNull.Value.ToString) Then '如果非空,则赋给对象的属性

                        Pr.SetValue(myT, value, Nothing)    '在运行期间,通过反射,动态的访问一个对象的属性
                    End If
                End If
            Next
            myList.Add(myT)   '添加到集合
        Next
        Return myList   '返回实体集合
    End Function
End Class

需要注意的是:这算是一个抽象体,这样我不同的功能所对应的不同的实体数据我都直接将它实例化就可以了,就像下面代码这样:




我先将该泛型集合的封装体进行实例化,判断查询出来的数据是否为空,如果不为空就将数据放在泛型集合中,然后将泛型集合作为返回值返回。这样一来,直接切断了datatable和层之间的联系,降低了D层对datatable的依赖度。所以泛型集合堪称数据承载神器。

总的来说,不管是实体型、datatable型还是泛型集合都是承载数据完成数据传递使命的一种方式,而用处也只是相对于具体情况而言,我们用添加设计模式后的三层建造机房收费本来就是为了解耦,所以使用泛型集合也是积极响应解耦的号召,所以没有谁好不好,这都是一种相对的说法。

我的理解目前就这么多,如果有不对的欢迎大家跟我交流,也希望这个理解不深的博客能给大家带来帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: