基于.NET的多数据源系统开发与应用

2013-04-29 17:24:56赵爱美
计算机时代 2013年5期

赵爱美

摘 要: 许多系统都用到了多个不同类型的数据源,或在不同类型数据源之间进行切换。如果利用原有.NET三层架构,当增加或改变一种不同类型的数据源时,需要修改大量的代码。为此,基于.NET框架,采用简单工厂模式和反射机制对原有的三层架构进行了改进,使系统在不改变界面层和业务逻辑层的情况下,实现了数据源的扩展。运用改进的方法以教学资源库系统为例,以C#语言进行了实现。

关键词: .NET; 简单工厂模式; 反射; 多数据源

中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2013)05-43-02

Development and application of multi-data source system based on .NET

Zhao Aimei

(Shandong Foreign Trade Vocational College, Qingdao, Shandong 266071, China)

Abstract: Numerous systems use various types of data sources, or they switch between different types of data sources. If using the original .NET three-layer architecture, when adding or changing a different type of data source, considerable codes needs modifying. Therefore, based on .NET framework, simple factory pattern and reflection on the three-layer architecture is applied to improve the original system. The system is adjusted to adapt to the new different data source without changing the interface layer and business logic layer. In this paper, take teaching resource library system using improved method as an example, the C# language is realized.

Key words: .NET; simple factory pattern; refrection; multi-data source

0 引言

应用程序能够支持多种不同类型数据库,这对程序的扩展,以及和现有系统共用数据库都有很大的益处。以教学资源库系统为例,一方面教学资源库建设是一个长期的系统工程,在教学资源库系统建成后应考虑系统的可扩展性;另一方面教学资源库系统应充分利用现有数据库资源。一直以来国家非常重视精品课程的建设,各院校都有了一定数量的国家级、省级和院级的精品课程,这对提高教学质量,提高学生的素质无疑起到了很大的促进作用。但这些精品课程网站采用了SQL Server、Aceess、Oracle等不同类型的数据库,如果摒弃现有的数据库,在资源上会有很大的浪费,因此对现有的多数据源进行集成是我们急需研究的课题。

本文对现有三层Web应用程序架构加以改造,在三层架构中的数据访问层加入了.NET简单工厂模式和反射机制,使系统在无需修改界面层和业务逻辑层源代码,少量修改或增加数据库访问层源代码的情况下就可以实现在不同类型数据源之间的切换。改造后的系统在不影响现有性能,也不会带来新缺陷的前提下,扩展了对新数据源的适应性。

1 目前架构存在的问题

目前软件架构普遍采用三层结构化设计,即将系统划分为界面层(User Interface)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。三层架构体现了“高内聚,低耦合”的思想,这对权责划分、软件的复用、后期维护等方面都有很大的益处。

但当系统需要多种数据源或需要在多种数据源之间进行切换时表现出的可移植性很差。如图1所示,当系统需要访问SQL Server数据库时,在数据库访问层需要直接使用一些诸如SqlConnection、SqlCommand等对象,业务逻辑层为了使用这些服务,必须引用具体的数据访问类(数据访问层)的对象。假设系统需要切换成Accesss数据库,数据访问层则使用OleDbConnection、OleDbCommand等对象,对应的业务逻輯层也需要做相应改变。因此运用原有三层架构数据访问层虽然封装了数据访问的功能,并为业务逻辑层提供了服务,但当系统需要增加或修改某种数据源时必须修改或增加大量代码。这增大了层间的耦合性,同时减弱了业务逻辑层的内聚力。因此我们需要采用某种模式或机制,使业务逻辑层专注于使用下层提供的数据访问服务而不必管是由哪种数据源来提供这种服务的。

[界面层(UI)][业务逻辑层(BLL)][SQLServerBLL][AccessBLL][数据访问层(DAL)][SQLServerDAL

SqlConnection等][AccessDAL

OleDbConnection等] [SQL Server

数据库] [Access

数据库]

图1 修改前的三层架构

2 解决方法:三层架构+简单工厂模式+反射机制

在原有三层架构的基础上,在数据访问层建立一个抽象工厂并抽象出一个通用接口,从而可以在不改变业务逻辑层的情况下有不同的数据访问层实现,比如一个系统同时支持Access,SQL Server,Oralce数据库的情况,我们只要设计一个界面层和业务逻辑层,就可以实现多个数据访问层,从而使同一个系统支持多种数据源。

[业务逻辑层(BLL)][IDAL][DALFacotry][数据访问层

(DAL)][SQLServerDAL

SqlConnection等][AccessDAL

OleDbConnection等] [SQL Server

数据库] [Access

数据库][界面层(UI)]

图2 修改后的三层架构

2.1 数据访问层接口

.NET中的接口提供一组公共方法和属性,不需要具体实现,只是告诉继承它的类至少要实现哪些功能,继承它的类可以增加自己的方法。如果增加不同数据源,只需要在数据访问层增加一个类即可,不会影响界面层和业务逻辑层,这对系统的扩展有极大的用处。

图2中IDAL是数据访问层接口,这样做的好处是使业务逻辑层调用数据访问层接口即可实现数据库的增删改等操作。业务逻辑层与数据访问层是一种抽象依赖的关系,而非具体依赖,以教学资源库系统的新闻为例,在该接口中有增加、删除、修改数据库的三个方法,特定的实现由具体数据库类完成。

namespace TeachRes.IDAL

{ public interface INews

{ bool addNews(News New);

bool delNews(int NewsID);

bool updateNews(News New);

}

}

2.2 简单工厂模式和反射机制

简单工厂模式属于创建型模式[1,2],又叫做静态工厂方法(Static Factory Method)模式,是由一个工厂对象决定创建出哪一种产品类的实例。图2中DALFactory是简单工厂类,基本思想是让业务逻辑层(BLL)仅仅知道工厂类, 并把产品以接口形式返回给业务逻辑层, 把对象的创建细节对业务逻辑层完全屏蔽。在该类中根据用户配置返回数据库的类名,通过类反射创建出类的实例。

反射[3]是在运行时动态分析、操纵和创建对象的机制,它是一种动态实例化类型的语言机制,利用反射实现动态类型实例化的关键在于获得类型名称。类型是程序集(Assembly)的一部分,因此完整的类型名称不仅要有类所在名称空间、类名,还要有所在程序集的名称。通过反射机制可以得到一个给定程序集的所有类型列表。

以教学资源库系统为例[4],编码如下。

public sealed class DALFactory

{ //从Web.Config中读取需要连接的数据源,可在Web.Config配

置多个,在这里动态切换

private static readonly string path=System.Configuration

.ConfigurationManager.AppSettings["WebDAL"];

//创建数据访问类 并以接口的形式返回:INews

public static INews createINews()

{ string classname="TeachRes."+path+".NewsDAL";

return (INews)Assembly.Load(path)

.CreateInstance(classname);

}

}

2.3 可以根据需要创建多个数据访问层,这里假设有两个分别支持SQL Server和Access

⑴ 访问SQL Server数据库

namespace TeachRes.SQLServerDAL

{ public class NewsDAL:INews

{ public bool addNews(News New)

{ //SQL实现,访问SQL Server数据库

}

}

}

⑵ 访问Access数据库

namespace TeachRes.AccessDAL

{ public class NewsDAL:INews

{ public bool addNews(News New)

{ //OLEDB实现,访问access数据库

}

}

}

2.4 业务逻辑层访问方式

namespace TeachRes.BLL

{ public class BNews

{ private INews iNews=null;

public BNews()

{ iNews=DALFactory.createINews();

}

public bool addNews(News New)

{ return iNews.addNews(New);

}

}

}

3 結束语

本文在经典的三层架构基础上,提出了三层架构+简单工厂模式+反射机制的方式开发应用程序。利用改进的三层架构可以在不改变界面层和业务逻辑层的情况下,实现多数据源的访问或切换。本解决方案的提出将有利于应用程序的进一步扩展,可实现代码的复用。同时本文以教学资源库系统的开发为例给出了核心实现方式,这对其他复杂系统的开发有极大的借鉴意义。

参考文献:

[1] James W. Cooper.C#设计模式[M].电子工业出版社,2011.

[2] Alan Shalloway James R. Trott.Design Patterns Explained[M].中国

电力出版社,2001.

[3] Robert C. Martin.敏捷软件开发-原则、模式与实践[M].清华大学出

版社,2003.

[4] Don Box, Chris Sells. .NET本质论 第1卷:公共语言运行库[M].中国

电力出版社,2004.

[5] 高雅侠,邹海荣.计算机网络教学平台的开发与设计[J].计算机时代,

2012.8:13-15