APP下载

NET三层架构中一种对数据访问层进行解耦的快速开发模型及实现

2018-01-23梁启恒

价值工程 2017年29期

梁启恒

摘要:文章对.NET三层架构的耦合性进行了探讨,提出一种利用强数据类型数据集和反射、泛型技术对数据访问层进行解耦的开发模型并实现之,进一步降低三个层次之间的耦合度。

关键词:数据访问层;解耦;反射;泛型;三层架构技术

0引言

我们开发业务系统,都会希望这个业务系统具备模块化、松耦合的特性,这样可以达到快速开发和适应业务系统变更的目的。

1三层架构

通常意义上的三层架构(3-tier architecture)就是将整个系统从上至下划分为:表示层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的体现了“高内聚,低耦合”的思想,三个层次各负其责,相对独立。数据访问层仅仅负责对数据库的增删查改,功能可以很简单。业务逻辑层负责从数据访问层获取数据,根据业务逻辑对数据进行处理,并将处理结果提供给表示层进行显示。表示层一般是通过用户界面,将用户的输入(请求)经过简单处理,提交给表示层,然后把表示层返回的结果在用户界面上显示。

2三层架构的解耦

三层架构的优势,是各司其职,降低耦合。耦合度的衡量,可以通过考察三个层次之间的依赖关系。依赖关系越紧密,耦合度越高。耦合度高的称之为紧耦合,反之称为松耦合。我们的目标就是降低三层之间的依赖关系,如:在数据访问层发生改变时,业务逻辑层不需要做出修改或尽量少修改。松耦合的三层架构有助于我们快速开发应用,也有助于我们灵活地增添业务模块。

本文的目的,就是提出一种在NET三层架构中对数据访问层进行解耦的快速开发模型并实现之。

3数据访问层的解耦模型

通常在三层架构中,数据访问层与数据库的耦合度很高。虽然数据访问层功能较简单,主要是实现数据的增删查改。但是在实际的开发实践中,这一部分的开发往往需要开发人员编写大量的SQL语句,如果数据表发生改变,几乎所有有关的增删查改的SQL语句都需要修改,增加了升级和维护的工作量,且极易出错。

解决办法是,我们可以通过使用.NET框架下的强数据类型数据集DataSet,建立模型类Model,利用反射和泛型,实现数据访问层的解耦。反射可以将Model和DataSet的数据表进行自动映射转换,使得我们在执行增删查改操作时不必关心字段参数,只需模型类的属性与数据表字段一一对应即可。利用泛型则解决了多表的问题:实现一个泛型类,就可以对应所有数据表的增删查改操作,而不需要对每张数据表都编写一个数据访问类。泛型简化了代码,也降低了DAL与数据库的耦合度。增加一个数据表,或是修改数据表,只需要更新DataSet和Model,就可以实现对新数据表的增删查改操作,大大降低代码的维护量。

泛型实现的关键就是新增的模型类Model。模型类是数据表的实体类,要求其对外公开的属性与数据库表的字段具有一一对应关系。DAL、BLL、UI三层分别引用Model,Model事实上成为各层访问数据的接口定义。利用反射机制使模型类和数据访问类泛型化,进一步抽象,统一外部对各数据表的访问,从而降低各层之间的耦合度,更是数据访问层解耦的关键之处。(图1)

4 DAL解耦模型的实现

4.1强数据类型数据集DataSet

DataSet可以在VS IDE中通过拖动数据源快速生成各数据表的实例。使用强数据类型数据集,各数据项都有明确的类型定义,如果类型不符,编译就会出错。这样有两个好处,一是减少出错机会,二是可以快速生成,减少代码的编写,VS支持直接拖动数据表生成实例,不用编写一句代码。在DataSet中,每个数据表适配器TableAdapter都是访问对应数据表的接口类,如userTableAdapter是访问user数据表的接口类。在DAL中通过初始化TableAdapter来访问数据表。我们为每个数据表适配器TableAdapter添加增删查改方法,如InsertQuery、UpdateQuery等。为方便BLL的数据处理,InsertQuery应添加select@@identity,并将ExecuteMode更改为Scalar模式,以返回新增数据的Identity值,即ID值。

4.2泛型数据适配器DataAdapter

为了简化对数据库的访问,在DAL添加一个访问数据集的泛型数据适配器DataAdapter,使用泛型声明,如:

public class DataAdapter

where T:class,Hew()

where D:class,new0

其中,T为模型类,D为数据表适配器TableAdapter。DAL对所有数据表的访问都可以通过DataAdapter来实现。如前文所述,这个泛型数据适配器可以适应对所有数据表的访问操作。

泛型数据适配器DataAdapter是这个模型的核心,其实现方法是:①首先声明并初始化一个数据表适配器的泛型变量,private D adapter=new D(),adapter变量就代表了所有的数据表适配器TableAdapter。②创建一个方法getProperties,把模型实体类T转换为访问数据表的参数对象列表。③创建一个辅助类ModelConvertHelper.ConvertToModel,把数据查询结果转换为模型实体类。④创建一个调用TableAdapter方法的通用方法object Get(string MethodName,object parameter)。⑤调用Get方法,分别实现对数据表的增、删、查、改等方法,如Update(T model),可以传入模型类实体实现对数据表的更新操作,免去了编写各个数据表的更新SQL語句。部分代码如下: