摘要:LINQ作为一种数据操作技术,它能够将复杂的查询应用简化成一个简单的查询语句,在传统的软件开发中,那些复杂、冗余、难以实现的方法使用LINQ技术都能很好的解决,极大的方便了开发人员对于业务逻辑的处理代码的编写。LINQ作为编程语言的一部分,它还弥补了SQL语句中的一些不足,在一定的程度上达到防止SQL注入式攻击的目的。文中针对LINQ技术进行研究,结合传统的基于.NET三层架构模型,给出一种基于.NET 的LINQ的三层架构方式。并采用基于LINQ三层架构对学生信息管理系统加以实现,提高了应用程序的安全性和可移植性。
关键词:LINQ; LINQ to SQL;数据模型 ;三层架构
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)12-2743-04
.NET LINQ based on to Research and Realization of Three Layer Architecture of SQL
FANG Sheng
(Anhui Business College of Vocational Technology,Wuhu 241002,China)
Abstract: LINQ is a data operation technique, and it can be used to simplify the query into a simple query. In the traditional software development, the redundant, complex, difficult to achieve using LINQ technology can solve good, great convenience to the developers for handling code business logic programming. LINQ as part of a programming language, it also makes up some deficiencies in the SQL statement, to prevent SQL injection attacks to some extent. In this paper, LINQ technology is researched, combined with the.NET three layer architecture model based on the traditional, an algorithm based on three layer.NET architecture of LINQ is presented. And based on LINQ three layer architecture, the student information management system is realized, and improves the application security and portability.
Key words: LINQ; LINQ to SQL; data model; the three layer architecture
随着软件应用领域的日益扩大,软件需要处理的数据类型和数据量也随之不断增加。对于数据访问的安全性、方便性以及通用性引起软件开发人员的普遍关注。因此,微软公司在.net3.5中增加了LINQ(Language Integrated Query,语言集成查询)数据操作技术,它为软件开发人员提供了一种统一的数据查询模式,可以有效的提高数据访问的安全性和高效性。
1 LINQ体系结构
LINQ是.Net Framework中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。LINQ可以操作任何存储形式的数据源,如对象(集合、数组、字符串等)、关系(关系数据库、ADO.NET数据集等)以及XML。LINQ的架构如图1所示。[[1]]
其中,LINQ to Objects是对内存进行操作,LINQ to SQL是对数据库进行操作,LINQ to XML是对XML文件进行的操作,
2 基于LINQ的三层架构
2.1 传统的三层架构
通常意义上的三层架构是将整个业务应用划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。为了便于数据的传递,更好的体现面向对象思想,通常会在传统三层的基础上增加一个业务实体 Model项,称为模型层。它包含与数据库表对应的实体类。传统的三层架构如图2所示。[[2]]
2.2 基于LINQ to SQL的三层架构
LINQ to SQL是操纵数据库重要的技术,在LINQ to SQL中,关系数据库的数据模型映射到开发人员所使用的编程语言表示的对象模型,对对象模型的操作就是对关系数据库的操作。
要实现LINQ to SQL,首先必须根据现有关系数据库的元数据创建对象模型。而利用对象关系设计器(O/R设计器)创建的对象模型包含了传统的三层架构中的实体类。因此,可以根据传统的三层架构建立基于LINQ to SQL 三层体系结构如图3所示。
其中,DataLinq层主要包括实体类和DataContext类。通常情况下,一个实体类对应数据库中的一张表,利用实体类的实例在不同的层之间作为数据对象进行数据传输。而O/R设计器生成的强类型DataContext,它表示LINQ to SQL框架的主入口点,用于在实体类与数据库之间传送和接收数据。[[3]]
3 基于LINQ的三层架构的实现endprint
本文以学生信息管理系统“登录”模块为例来说明基于LINQ 的 WINFORM系统三层架构的具体实现。
3.1 数据库
利用Sql Server2005创建名为mySchool的数据库,该数据库包含六张表,分别为管理员表(Admin)、学生表(Student)、教师表(Teacher)、年级表(Grade)、成绩表(Result)和课程表(Subject)。在此仅以管理员表为例。管理员表结构如表1所示:
3.2 基于LINQ的三层架构的搭建
利用Visual Studio 2008创建一个WinForm项目,其步骤如下:
1)新建表示层项目,选择WinForm窗体,将其命名为mySchool。
2)创建业务逻辑层项目,选择类库,将其命名为mySchool.BLL。
3)创建数据访问层项目,选择类库,将其命名为mySchool.DAL。
4)创建对象模型项目,选择类库,将其命名为mySchool.DataLinq。
5)添加层之间的依赖关系。表示层添加对逻辑处理层、 DataLinq的项目引用。逻辑处理层添加对数据访问层和 DataLinq的项目引用。数据访问层添加对System.Data.Linq和DataLinq的项目引用;基于Linq的三层架构如图4所示。
3.3 基于LINQ的三层架构功能的实现
1) 创建对象模型
在DataLinq层添加LINQ to SQL类,并命名为mySchool.dbml。然后利用对象关系设计器,从数据库中,把表拖动到对象关系设计器的界面上,这时就会生成一个实体类,该类包含了与表的字段对应的属性。对象关系设计器生成的对象模型如图5所示。
图5 对象关系设计器生成的对象模型
2) 数据访问层实现
创建了对象模型后,就可以操作数据库了。针对模型层中的类,数据访问层有一个对应的数据访问类。例如,针对Admin实体类,有一个对应的adminServices类,用以处理有关Admin表的数据。创建的类结构和Linq to SQL中的查询如下:
public class adminServices
{private static mySchoolDataContext da=new mySchoolDataContext();
public static Admin getAdmin(Admin admin)
{try
{var result = from newAdmin in da.Admin
where newAdmin.LoginId == admin.LoginId
select newAdmin;
return result.Single();
}
catch (Exception ex)
{throw ex;
}}}
3) 业务逻辑层实现
业务逻辑层提供对各个业务的处理,接收表示层的数据,通过个性化需求的处理,传递给数据层处理相应事务,针对项目应用的业务规则、合法性校验等进行处理。对于Admin类的业务处理,创建的adminManager类结构如下:
public class adminManager
{public static bool getAdmin(Admin admin)
{Admin newAdmin = adminServices.getAdmin(admin);
if (newAdmin == null)
{return false;
}
else if (newAdmin.LoginPwd == admin.LoginPwd)
{return true;
}
else
{return false;
}}}
4) 表示层实现
表示层提供与用户交互的界面,将数据依据不同的功能,传递给业务逻辑层中不同的对象。根据登录功能操作的流程,在“登录”按钮的Click事件中,编写如下的验证方法:
private void btLogin_Click(object sender, EventArgs e)
{
Admin admin = new Admin();
admin.LoginId = this.txtLoginId.Text.Trim();
admin.LoginPwd = this.txtLoginPwd.Text.Trim();
if (adminManager.getAdmin(admin))
{
frmMainWindows fMM = new frmMainWindows();
fMM.Show();
}
else
{
MessageBox.Show("账号或者密码错误,请重新输入!");
return;
}}
从上面的代码中可以看到,并没有出现具体的用户验证,而是通过调用业务逻辑层中的adminManager.getAdmin方法来实现的。总之,在表示层中处理的主要是与用户交互相关的界面操作,而相应的功能实现则需要通过调用业务逻辑层中的内容来实现。
4 结束语
本文通过一个简单实例, 描述了 LINQ 在三层架构软件开发模型下的应用。在以往三层架构系统开发过程中,软件开发人员必须自己建立相应的实体类并直接对数据库操作,而基于LINQ的分层架构直接与对象模型交互而无需直接与数据库交互。对于不同的数据源,它都采用同样的访问方式。通过简单易用的接口,它不仅大大提高了软件开发的效率,而且可以安全地消除来自数据库应用程序的SQL注入攻击,增强了应用程序的安全性。
参考文献:
[1] 刘乃琦,郭小芳 ASP.NET应用开发与实践[M].北京:人民邮电出版社,2013.
[2] 程光华.Web应用程序开发[M].北京:清华大学出版社,2011.
[3] 张联锋.陈文臣 ASP.NET3.5程序设计与项目实践[M].北京:电子工业出版社,2011.
本文以学生信息管理系统“登录”模块为例来说明基于LINQ 的 WINFORM系统三层架构的具体实现。
3.1 数据库
利用Sql Server2005创建名为mySchool的数据库,该数据库包含六张表,分别为管理员表(Admin)、学生表(Student)、教师表(Teacher)、年级表(Grade)、成绩表(Result)和课程表(Subject)。在此仅以管理员表为例。管理员表结构如表1所示:
3.2 基于LINQ的三层架构的搭建
利用Visual Studio 2008创建一个WinForm项目,其步骤如下:
1)新建表示层项目,选择WinForm窗体,将其命名为mySchool。
2)创建业务逻辑层项目,选择类库,将其命名为mySchool.BLL。
3)创建数据访问层项目,选择类库,将其命名为mySchool.DAL。
4)创建对象模型项目,选择类库,将其命名为mySchool.DataLinq。
5)添加层之间的依赖关系。表示层添加对逻辑处理层、 DataLinq的项目引用。逻辑处理层添加对数据访问层和 DataLinq的项目引用。数据访问层添加对System.Data.Linq和DataLinq的项目引用;基于Linq的三层架构如图4所示。
3.3 基于LINQ的三层架构功能的实现
1) 创建对象模型
在DataLinq层添加LINQ to SQL类,并命名为mySchool.dbml。然后利用对象关系设计器,从数据库中,把表拖动到对象关系设计器的界面上,这时就会生成一个实体类,该类包含了与表的字段对应的属性。对象关系设计器生成的对象模型如图5所示。
图5 对象关系设计器生成的对象模型
2) 数据访问层实现
创建了对象模型后,就可以操作数据库了。针对模型层中的类,数据访问层有一个对应的数据访问类。例如,针对Admin实体类,有一个对应的adminServices类,用以处理有关Admin表的数据。创建的类结构和Linq to SQL中的查询如下:
public class adminServices
{private static mySchoolDataContext da=new mySchoolDataContext();
public static Admin getAdmin(Admin admin)
{try
{var result = from newAdmin in da.Admin
where newAdmin.LoginId == admin.LoginId
select newAdmin;
return result.Single();
}
catch (Exception ex)
{throw ex;
}}}
3) 业务逻辑层实现
业务逻辑层提供对各个业务的处理,接收表示层的数据,通过个性化需求的处理,传递给数据层处理相应事务,针对项目应用的业务规则、合法性校验等进行处理。对于Admin类的业务处理,创建的adminManager类结构如下:
public class adminManager
{public static bool getAdmin(Admin admin)
{Admin newAdmin = adminServices.getAdmin(admin);
if (newAdmin == null)
{return false;
}
else if (newAdmin.LoginPwd == admin.LoginPwd)
{return true;
}
else
{return false;
}}}
4) 表示层实现
表示层提供与用户交互的界面,将数据依据不同的功能,传递给业务逻辑层中不同的对象。根据登录功能操作的流程,在“登录”按钮的Click事件中,编写如下的验证方法:
private void btLogin_Click(object sender, EventArgs e)
{
Admin admin = new Admin();
admin.LoginId = this.txtLoginId.Text.Trim();
admin.LoginPwd = this.txtLoginPwd.Text.Trim();
if (adminManager.getAdmin(admin))
{
frmMainWindows fMM = new frmMainWindows();
fMM.Show();
}
else
{
MessageBox.Show("账号或者密码错误,请重新输入!");
return;
}}
从上面的代码中可以看到,并没有出现具体的用户验证,而是通过调用业务逻辑层中的adminManager.getAdmin方法来实现的。总之,在表示层中处理的主要是与用户交互相关的界面操作,而相应的功能实现则需要通过调用业务逻辑层中的内容来实现。
4 结束语
本文通过一个简单实例, 描述了 LINQ 在三层架构软件开发模型下的应用。在以往三层架构系统开发过程中,软件开发人员必须自己建立相应的实体类并直接对数据库操作,而基于LINQ的分层架构直接与对象模型交互而无需直接与数据库交互。对于不同的数据源,它都采用同样的访问方式。通过简单易用的接口,它不仅大大提高了软件开发的效率,而且可以安全地消除来自数据库应用程序的SQL注入攻击,增强了应用程序的安全性。
参考文献:
[1] 刘乃琦,郭小芳 ASP.NET应用开发与实践[M].北京:人民邮电出版社,2013.
[2] 程光华.Web应用程序开发[M].北京:清华大学出版社,2011.
[3] 张联锋.陈文臣 ASP.NET3.5程序设计与项目实践[M].北京:电子工业出版社,2011.
本文以学生信息管理系统“登录”模块为例来说明基于LINQ 的 WINFORM系统三层架构的具体实现。
3.1 数据库
利用Sql Server2005创建名为mySchool的数据库,该数据库包含六张表,分别为管理员表(Admin)、学生表(Student)、教师表(Teacher)、年级表(Grade)、成绩表(Result)和课程表(Subject)。在此仅以管理员表为例。管理员表结构如表1所示:
3.2 基于LINQ的三层架构的搭建
利用Visual Studio 2008创建一个WinForm项目,其步骤如下:
1)新建表示层项目,选择WinForm窗体,将其命名为mySchool。
2)创建业务逻辑层项目,选择类库,将其命名为mySchool.BLL。
3)创建数据访问层项目,选择类库,将其命名为mySchool.DAL。
4)创建对象模型项目,选择类库,将其命名为mySchool.DataLinq。
5)添加层之间的依赖关系。表示层添加对逻辑处理层、 DataLinq的项目引用。逻辑处理层添加对数据访问层和 DataLinq的项目引用。数据访问层添加对System.Data.Linq和DataLinq的项目引用;基于Linq的三层架构如图4所示。
3.3 基于LINQ的三层架构功能的实现
1) 创建对象模型
在DataLinq层添加LINQ to SQL类,并命名为mySchool.dbml。然后利用对象关系设计器,从数据库中,把表拖动到对象关系设计器的界面上,这时就会生成一个实体类,该类包含了与表的字段对应的属性。对象关系设计器生成的对象模型如图5所示。
图5 对象关系设计器生成的对象模型
2) 数据访问层实现
创建了对象模型后,就可以操作数据库了。针对模型层中的类,数据访问层有一个对应的数据访问类。例如,针对Admin实体类,有一个对应的adminServices类,用以处理有关Admin表的数据。创建的类结构和Linq to SQL中的查询如下:
public class adminServices
{private static mySchoolDataContext da=new mySchoolDataContext();
public static Admin getAdmin(Admin admin)
{try
{var result = from newAdmin in da.Admin
where newAdmin.LoginId == admin.LoginId
select newAdmin;
return result.Single();
}
catch (Exception ex)
{throw ex;
}}}
3) 业务逻辑层实现
业务逻辑层提供对各个业务的处理,接收表示层的数据,通过个性化需求的处理,传递给数据层处理相应事务,针对项目应用的业务规则、合法性校验等进行处理。对于Admin类的业务处理,创建的adminManager类结构如下:
public class adminManager
{public static bool getAdmin(Admin admin)
{Admin newAdmin = adminServices.getAdmin(admin);
if (newAdmin == null)
{return false;
}
else if (newAdmin.LoginPwd == admin.LoginPwd)
{return true;
}
else
{return false;
}}}
4) 表示层实现
表示层提供与用户交互的界面,将数据依据不同的功能,传递给业务逻辑层中不同的对象。根据登录功能操作的流程,在“登录”按钮的Click事件中,编写如下的验证方法:
private void btLogin_Click(object sender, EventArgs e)
{
Admin admin = new Admin();
admin.LoginId = this.txtLoginId.Text.Trim();
admin.LoginPwd = this.txtLoginPwd.Text.Trim();
if (adminManager.getAdmin(admin))
{
frmMainWindows fMM = new frmMainWindows();
fMM.Show();
}
else
{
MessageBox.Show("账号或者密码错误,请重新输入!");
return;
}}
从上面的代码中可以看到,并没有出现具体的用户验证,而是通过调用业务逻辑层中的adminManager.getAdmin方法来实现的。总之,在表示层中处理的主要是与用户交互相关的界面操作,而相应的功能实现则需要通过调用业务逻辑层中的内容来实现。
4 结束语
本文通过一个简单实例, 描述了 LINQ 在三层架构软件开发模型下的应用。在以往三层架构系统开发过程中,软件开发人员必须自己建立相应的实体类并直接对数据库操作,而基于LINQ的分层架构直接与对象模型交互而无需直接与数据库交互。对于不同的数据源,它都采用同样的访问方式。通过简单易用的接口,它不仅大大提高了软件开发的效率,而且可以安全地消除来自数据库应用程序的SQL注入攻击,增强了应用程序的安全性。
参考文献:
[1] 刘乃琦,郭小芳 ASP.NET应用开发与实践[M].北京:人民邮电出版社,2013.
[2] 程光华.Web应用程序开发[M].北京:清华大学出版社,2011.
[3] 张联锋.陈文臣 ASP.NET3.5程序设计与项目实践[M].北京:电子工业出版社,2011.