3.1 使用实体类构建三层结构概述
在上一章中的三层架构中,我们使用DataSet来进行数据的传递,但在OOP的开发中,有很大的局限性:
1. DataSet不具备良好的面向对象特性,使用起来不够直观、方便。
2. 对DataSet中的数据进行查找时容易出错。例如:我们要查询DataSet中学员信息DataTable中的某个值时,必须指定行索引与列名,这只是一个简单的查询,如果稍微复杂就需要遍历所有的行集。
3. 由于DataSet的核心结构与数据库的核心结构完全相同,所以它把数据结构完全暴露在表示层和业务逻辑层。
使用实体类的主要好处来自一个简单的事实,即实体类是完全受我们控制的对象,它具有面向对象的基本特征。我们可以*地向实体类添加行为(如:判断是否为空,如果为空指定默认值,这只是一个简单的扩展。其实和DataSet一样,业务实体也承载着一个数据载体的任务,实体类在三层结构中的应用如下图所示:
3.2 业务实体类
业务实体类术语叫“Data Transfer Object(数据传输对象)”,主要用来在各层间传输数据,因此没有定义方法,当然有需要定义一些验证是否有效的方法。
3.3 实体类的使用
在表示层中使用实体类需要做两件事。
(1)将解析实体对象中封装的数据展示给用户。
当表示层接收到从业务逻辑层返回的实体对象,并将实体对象中封装的信息展示给用户时,表示层需要对实体对象中封装的信息进行解析。表示层对实体对象的解析分两种情况:
第一种是对单个实体对象进行解析,这种解析一般常用的数据展示控件为:TextBox(文本框)、Label(标签)等控件,它们通常有一个Text属性用于展示数据。可以通过业务实体对象的属性获得实体对象中的数据,将获得的属性值赋给“Text”属性。
第二种是对实体对象集合进行解析。将多个业务实体对象封装到List<T>中称为实体对象集合,对实体对象集合的解析,Visual Studio中已经封装好的控件如:DataGridView(数据表格视图)控件、ComboBox(下拉列表)控件等,它们都有一个数据源属性(DataSource),可以直接将实体对象集合绑定到数据源属性上。
(2)将用户请求的数据封装到实体对象中
在表示层,我们如何将用户请求的数据封装到实体对象中,我们首先需要实例化实体对象,然后将用户的请求赋值给实体对象中的对应的属性。
3.3.1在表示层使用实体类:如下图所示:
表示层使用实体类用于封装数据或对实体数据进行解析。
3.3.2 在业务逻辑层中使用实体类
业务逻辑层实体类的使用不同于表示层,它主要负责传输实体对象,并对实体对象中封装的数据进行处理。需要做两件事情:
(1)将接收到得实体对象传输到下一层。
当业务逻辑层接收到装有信息的业务实体对象后,根据请求或响应将实体对象传到下一层。
(2)根据用户请求对实体对象中的数据进行处理。
当我们使用实体类开发三层应用程序时,数据处理来自两个方面。
一. 业务实体对数据的处理,实体类本身是由属性组成的,而大多都是可读可写属性。所以,根据请求的不同可以给属性设置不同的值,例如:当用户的请求为空时,给属性设置默认值。
二. 业务逻辑对数据的处理,例如:用户登录,用户的身份分管理员和普通员工,此时业务逻辑层根据用户身份分别进行不同的处理。
业务逻辑层使用实体类如下图所示:
3.3.3 在数据访问层中使用实体类
在数据访问层中使用实体类需要做两件事情。
(1)将数据库中的数据封装到实体对象中或将多个实体对象封装成集合。
当用户的请求时数据查询请求时,数据访问层需要实现对数据库的查询访问。当请求的结果只有一条记录时,我们将这条记录封装成一个实体对象。当请求的结果是多条记录时,我们将每一条记录封装成一个实体对象,然后再将多个实体对象封装成集合(将多个实体对象封装到List<T>中)。
(2)将实体对象中的数据保存到数据库中。
当用户的请求是数据保存请求时,数据访问层首先对实体对象中封装的数据进行解析,然后将解析出的数据保存到数据库中。
数据访问层使用实体类如下图所示:
1
2
【