昨天看了一期WebCast,名字叫“Modern C#系列课程(8):多层结构应用程序设计”,解决了我对多层结构的一些疑惑,这里记录,这些问题是:商务逻辑层到底要干些什么?数据访问层确切的作用是什么?商务逻辑层和数据访问层之间的接口如何设计?使用动态的SQL语句还是存储过程?层之间如何传递数据?
商务逻辑层到底要干些什么?
支持商务过程中的所有涉及安全、商务规则(逻辑)和数据的处理(校验、数据操作)。
数据访问层确切的作用是什么?
数据访问层并不管理和存储数据,它只是提供商务逻辑层和数据库之间的接口。
商务逻辑层和数据访问层之间的接口如何设计?
接口可以分为high-level和low-level两种。
两种接口的例子如下:
high-level
{
dataStore.Update(c);
}
low-level
{
string sql;
sql = String.Format("Update customers set ",);
dataStore.Execute(sql);
}
从上边的代码可以看出high-level接口隐藏了商务逻辑层传来的细节信息,low-level接口将数据存储细节延伸到了商务逻辑层。这两种接口最大的不同就是提供细节的位置,到底依哪个为准呢?这其实是存在矛盾的。在现实中为了解决这一问题,大部分时候时候是采用一种妥协的方案。具体实现就是把DAT分成两级,如下图。
在图中,可以把黄色箭头理解成BT传过来的数据,可以是自定义类的实例、DataSet或者其他类型的东西。图中右边的这一层是利用Ado.net的一些机制去访问数据库,去执行“CRUD”(Create/Read/Update/Delete)的一些操作。图中左边部分的任务是从BT层传来的数据中提取出需要的数据、构造SQL语句等。
使用动态的SQL语句还是存储过程?
使用存储过程的好处有分离数据库模式和应用程序、提供数据访问控制的另一层(存储过程本生会验证一下数据格式是否正确)、封装复杂的SQL语句、保证事务执行、对提高性能有很大帮助。使用存储过程也有一些劣势,存储过程的格式是有数据库提供商制定的,他们并不是完全一样的,另外就是会降低灵活性。个人觉得简单的操作(比如获取用户列表)可以直接使用SQL语句,而复杂一些的操作、涉及到一些验证的操作(比如添加用户)则使用存储过程。
层之间如何传递数据?
视频中提到的四钟,分别是基本类型的数组、对象集合、原始的DataSet、强类型的DataSet。个人觉得在数据量少的地方直接使用基本类型,数据量多而且都与某一对象相关的时候(比如客户的各种信息)可以把他们封装一下再传递。视频里介绍了强类型DataSet,也非常实用。