基于.NET结构的软件系统框架的设计与实现

基于.NET结构的软件系统框架的设计与实现

摘要:本文以教务管理系统为例,分析了基于.NET结构的软件系统框架的特点,介绍了采用ADO.NET、实体类、LINQ To SQL、ADO.NET实体框架等四种开发技术实现基于.NET结构的软件系统框架。阐述了开发过程中的存在问题,并介绍了LINQ To SQL、ADO.NET实体框架等微软最新技术。

关键词:软件系统框架;LINQ To SQL;ADO.NET实体框架; 三层架构

中图分类号:TP311 文献标识码:A

0 引言

在构建大型的、复杂的企业级项目时,通常需要大量的代码。考虑到细化开发人员的分工、有利于代码维护和代码复用等因素,通常需要将整个应用分为若干个层次。其中,最流行的是三层架构程序设计方法。分层架构体现了“分而治之”的思想:通过将一个大的复杂的问题分解成许多小的相对简单的问题,然后逐个解决。

随着高等学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长。高校教务管理工作是高等教育中的一个极为重要的环节,是整个院校管理的核心和基础。面对庞大的信息量,手工处理方式已经很难跟上现代化管理步伐,随着计算机及通讯技术的迅速发展,就需要有教务管理系统来提高教务管理工作的效率。通过这样的系统,可以做到信息的规范管理、科学统计和快速的查询,从而减少管理方面的工作量。教务管理系统的基本

功能模块如图1所示:

 


    

图1   教务管理系统的基本功能模块

本文以教务管理系统为例,从实际开发的角度来讲述几种在VS.NET 2010环境中的软件系统开发中常见的三层架构模型,以及三层架构项目的开发过程和技术要点,从而让大家轻松实现三层架构项目的开发。

使用ADO.NET实现软件系统中的框架设计

实际上,在项目开发的过程中,有时把整个项目分为三层架构,其中包括:表示层(UI)、

业务逻辑层(BLL)和数据访问层(DAL)。三层的作用分别如下:

表示层:为用户提供交互操作界面,这一点不论是对于Web还是WinForm都是如此,就是用户界面操作。我们网站展示给用户看的界面。

业务逻辑层:负责关键业务的处理和数据的传递。复杂的逻辑判断和涉及到数据库的数据验证需要在此做出处理。根据传入的值返回用户想得到的值,或者处理相关的逻辑。

数据访问层:见名知意,负责数据库数据的访问。主要为业务逻辑层提供数据,根据传入的值来操作数据库。

用ADO.NET实现三层结构应用系统时,DataSet的主要作用是三层之间数据传递的载体。DataView是DataTable的动态数据视图,我们使用DataView的SortRowFilter属性实现数据的排序、过滤。

用ADD.NET实现三层结构应用系统时,数据访问层主要使用的类有:SqlConnection类,实现数据库连接。SqlCommand类,执行SQL命令。SqlDataReader类,读取数据。SqlDataAdapter类,执行SQL命令,返回DataSet。DataSet类,封装用户请求数据。用ADD.NET执行带参数的SQL命令时,我们需要使用参数(Parameters)集合的Add方法为SQL命令添加参数,包括参数名称、参数类型。

业务逻辑层实现数据传递、处理时,首先引用数据访问层,其次实例化数据访问层对象,最后调用数据访问层功能,并实现数据处理。

下面我们具体介绍使用ADO.NET实现教务管理系统中的学生信息维护模块的学生信息加载功能。

(1)新建一个空的解决方案:TeacherManagerSys,添加表示层、业务逻辑层、数据访问层,并添加各层之间的依赖:表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。解决方案中的文件结构如图2所示:

           图2  教务管理系统解决方案中的文件结构

(2)实现数据访问层,关键代码如下:

  public class StudentInfoService

    {

        string conStr = " Data Source=.;Initial Catalog=eisbook;Integrated Security=True ";

        public DataSet GetStudentInfo()

        {

            DataSet ds = new DataSet();

            SqlConnection cn = new SqlConnection(conStr);

            cn.Open();

            string sql = "select 学号,姓名,班级编号,性别,年级,政治面貌编号,民族编号,籍贯编号,身份证号,学籍编号 from 学生信息";

            SqlDataAdapter ad = new SqlDataAdapter(sql, cn);

            ad.Fill(ds);

            return ds;

        }

(3)实现业务逻辑层代码,关键代码如下:

using TeacherManagerSysDAL;

public class StduentInfoManager

    {

        StudentInfoService studentService = new StudentInfoService();

        public DataView GetStudentInfo()

        {

            DataView dvstudent = new DataView();

            dvstudent.Table = studentService.GetStudentInfo().Tables[0];

            return dvstudent;

        }

   (4) 设计表示层界面及代码,最终运行结果如图3所示:

                  图3 “学生信息维护”运行效果图

2 使用实体类实现软件系统中的框架设计

在第一节中,我们使用了DataSet实现了在三层结构中各层之间的数据传递。但是在面对对象软件的开发中,我们使用DataSet开发三层结构有许多局限:

DataSet不具备良好的面向对象(OO)特性,使用起来不够直观、方便;

对DataSet中的数据进行查找时容易出错。例如:我们要查询DataSet中一个表的某个值时,必须指定行索引与列名,这只是一个简单的,如果稍微复杂一点就需要遍历所有的行集。

由于DataSet的核心结构与数据库的核心结构完全相同,所以它把数据结构完全暴露在表示层和业务逻辑层,增加了安全隐患。

本节我们使用实体类实现软件系统中的框架设计。使用实体类的主要好处来自一个简单的事实,即实体类是完全受我们控制的对象,它具有面向对象的基本特征。我们可以自由地向实体类中添加行为(如:判断是否为空,如果为空指定默认值等,这只一个简单的扩展)。(1)实体类的实现

实体类是现实实体在计算机中的表示。它贯穿于整个架构,负担着在各层次及模块间传递数据的职责。下面我们看看实体类的定义,所谓实体类,简单地说就是描述一个业务实体的“类”,业务实体直观一点理解就是整个应用系统业务所涉及的对象(例如:我们教务管理系统中的、学员信息、班级、成绩、年级等)都是业务实体,从数据的存储来讲,业务实体就是存储应用系统信息的数据表,我们将每一个数据表中的字段定义成属性,并将这些属性用一个类封装——这个类就称为“实体类”,如图4所示。

图4  Admin实体类

(2)使用实体类构建三层结构

业务实体可以认为属于业务逻辑层。当然,如果将应用层次划分得更细致一点,可以将业务实体单独作为一层称为实体层。表示层、业务逻辑层、数据访问都依赖于实体层。各层之间数据的传递主要是实体对象(业务信息封装在实体对象中)。这样,三层结构表述如下:

表示层:位于最外层,离用户最近,用于显示数据和接受用户输入的数据,为用户提供一种交互式操作界面。表示层一般为Windows应用程序或Web应用程序。

业务逻辑层:是表示层和数据访问层之间通信的桥梁,主要负责数据的传递和处理,例如数据有效性的检验、业务逻辑描述相关功能。业务逻辑层通常为类库。

数据访问层:主要实现对数据的保存和读取操作。数据访问,可以访问关系数据库、文本文件或是XML文档。数据访问层通常为类库。

业务实体层,简称为实体层。实体类,简单地说是描述一个业务实体的类,业务实体直观一点理解就是整个应用系统业务所涉及的对象,从数据存储来讲,业务实体就是存储应用系统信息的数据表,我们将每一个数据表中的字段定义成属性,并将这些属性用一个类封装,这个类就是实体类。

下面我们具体使用实体类使用实体类和三层结构教务管理系统中的框架设计,具体步骤为:新建一个空的解决方案:TeacherManagerSys,添加表示层、业务逻辑层、数据访问层及业务实体,并添加各层之间的依赖:表示层依赖于业务逻辑层及业务实体,业务逻辑层依赖于数据访问层及业务实体,数据访问层依赖于业务实体。

在业务实体中,为了便于开发和管理,我们将定义的实体类与数据库中的表对应,用数据库中表的名称来命名实体类,如民族表,对应到实体类NativePlace:

public   class NativePlace

    {   string 籍贯编号;

        public string 籍贯编号1

        {  get { return 籍贯编号; }

            set { 籍贯编号 = value; }

        }

        string 籍贯;

        public string 籍贯1

        {   get { return 籍贯; }

            set { 籍贯 = value; }

        }

    }

与第一节类似,表示层、业务逻辑层、数据访问层代码基本相同,在此不再表述。

3 使用LINQ实现软件系统中的框架设计

长期以来,开发社区形成以下格局:面向对象与数据访问两个领域长期分裂,各自为政,编程语言中的数据类型与数据库中的数据类型形成两套体系。例如:C# 中字符串用 string 表示,SQL 中字符串用 NVarchar、Varchar、Char等表示。SQL 编码体验落后:没有智能感应,没有严格意义上的强类型和类型检查。SQL 和 XML 都有各自的查询语言,而对象没有自己的查询语言。

LINQ( Language Integrated Query )即语言集成查询,是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Server 数据库等等。LINQ 主要包含以下三部分:LINQ to Objects 主要负责对象的查询、LINQ to XML 主要负责 XML 的查询、LINQ to ADO.NET 主要负责数据库的查询。而LINQ to ADO.NET主要包含:LINQ to SQL、LINQ to DataSet、LINQ to Entities。LINQ架构如图5所示:

              图5   LINQ架构如图

与第1节、第2节不同,我们重新构建三层结构。如图6所示:

 

图6    使用LINQ的三层结构软件模型

我们这样做的目的是:(1)三层结构不允许在表示层中使用任何有关数据访问的内容,因此表示层中不能使用LINQ语法直接去访问数据,即便是已经对象化的;(2)之所以把LINQ语句放在逻辑层是因为,LINQ语法能够与C#混合使用,与传统的TSQL语言有很大不同,而且把它放在逻辑层,能够更加方便的处理业务上的规则。与此同时该层访问的并非数据实体,所以仍然是建立在数据访问层之上的层;(3)在数据访问层由VS2010自动建成,将数据对象化,使我们可以使用LINQ语法与访问它。

表示层的主要功能是:(1)使用LINQ把数据展示给用户;(2)INQ将用户请求数据传递到业务逻辑。业务逻辑层的主要功能是:(1)传递IQueryable;(2)对IQueryable中的数据进行处理。数据访问层的主要功能是:(1)将数据库中的数据转化为IQueryable中,(2)将IQueryable中的数据保存到数据库中。下面我们具体使用LINQ和三层结构实现学生信息管理系统实体。

下面我们使用LINQ和三层结构具体实现教务管理系统中的登录功能。具体步骤如下:

(1)与第一节类似,新建一个空的解决方案:TeacherManagerSys,添加表示层、业务逻辑层、数据访问层,并添加各层之间的依赖:表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。

(2)在数据访问层中添加TeachDatadbml:选中数据访问层,右击“添加”、“新建项”, “添加新项”对话框中选择“LINQ to SQL类”,输入TeachData.dbml,单击“添加”。

(3)配置数据源:在“服务器资源管理器”中选择“添加连接”,并指定教务管理系统“eisbook”数据库,把“eisbook”数据库中的用户类型表等数据表拖到 LINQ to SQL 的设计器中。

(4)在数据访问层添加代码,实现用户登录:

TeachDataDataContext context = new TeachDataDataContext();

        public bool Login(string userName, string userPwd)

        {

            var user= from userInfo in context.用户类型

             where userInfo.LoginId.Equals(userName) && userInfo.Loginpwd.Equals(userPwd)

                        select userInfo;

            if (user.Count() >= 1)

                return true;

            else

                return false;

        }

(5)编写业务逻辑层代码。

using TeacherManagerSysDAL;

using TeacherManagerSysDAL;

public bool Login(string userName, string userPwd)

        {           

                UserService userSer = new UserService();

                return userSer.Login(userName, userPwd);         

                 }

     (6)编写表示层代码:

        using TeacherManagerSysBLL;

         UserManager userMana = new UserManager();

        private void btnLogIn_Click(object sender, EventArgs e)

        {

            bool f = userMana.Login(txtLogInId.Text.Trim(), txtLogInPwd.Text.Trim());

               if (f == true)

               {

                  MainForm mainForm = new MainForm();

                  mainForm.Show();

                 this.Hide();

               }

              else

                  MessageBox.Show("用户名或密码错误!"); 

          }

通过上述编码,利用LINQ和三层结构实现了用户登录功能,对比利用实体类,代码简单很多。下面我们继续使用LINQ和三层结构实现教务管理系统的其他功能。

4 使用实体框架实现软件系统中的框架设计

实体框架是ADO.NET中的一组支持开发面向数据的软件应用程序技术。实体框架使开放人员可以采用特定于域的对象和属性的形式使用数据,而不必自己考虑存储这些数据的基础数据库表和列,大大提升了数据访问代码的通用性、可读性和编程效率。

实体框架(Entity Framework)全称为ADO.NET Entity Framework  实体框架,是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数据访问应用程序。目标是降低面向数据的应用程序所需的代码量并减轻维护工作。数据建模通常将数据模型分为3个部分:概念模型、逻辑模型和物理模型。基本结构如图7所示:

                 图7   实体框架基本结构图

下面我们使用实体框架和三层结构实现教务管理系统中的课程表维护功能。具体步骤如下:

(1)与前几节类似,新建一个空的解决方案:TeacherManagerSys,添加表示层、业务逻辑层、数据访问层,并添加各层之间的依赖:表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。

(2)在数据访问层中添加实体数据模型:TeacherManager.edmx。选中数据访问层,右击“添加”、“新建项”,在“添加新项”对话框中选择“ADO.NET实体数据模型”,输入TeacherManager.edmx,单击“添加”。

(3)配置数据源:在看到的视图数据模型向导,选择“从数据库生成”,点“下一步”。选择数据库连接,我们创建一个新连接,选择“新建连接”,填写好登陆信息并选择教务管理系统数据库“eisbook”后,点“确定”,再点“下一步”。

(4)在出现的对话框中选择数据对象对话框中选择本示例用到的两个数据表:课程表、课程信息表。并确保“在模型中加入外键列”,单击“完成”按钮。

经过上述步骤,在数据访问层自动添加了两个实体类:“课程信息”类、“课程表”类,同时在数据访问层自动添加了访问数据库的配置文件App.Config:

<configuration>

  <connectionStrings>

    <add name="eisbookEntities" connectionString="metadata=res://*/TeacherManager.csdl|res://*/ TeacherManager.ssdl|res://*/TeacherManager.msl;provider=System.Data.SqlClient;provider connection string= &quot;Data Source=.;Initial Catalog=eisbook;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

  </connectionStrings>

</configuration>

(5)在数据访问层添加CourtableService.cs类,编写代码,实现课程表的查询、添加、修改、删除等方法,如查询代码如下:

      eisbookEntities eisbookDb=new eisbookEntities();

       public IQueryable GetAllCourse()

       {

           var result = from S in eisbookDb.课程表

                        join G in eisbookDb.课程信息

                            on S.课程编号 equals G.课程编号

                        select new { S.编号,S.课序号, S.课程编号, G.课程名称, S.上课时间天,S.上课时间节,S.上课地点 };

           return result;

       }

    与上几节类似,可以编写其他各层代码,通过上述编码,利用实体框架、LINQ语言和三层结构实现了教务管理系统中课程表的维护功能,对比利用实体类,代码简单很多。

至此,如何在三层架构中使用实体框架就向你介绍完了,它应该能满足一般应用的要求。在实体框架结合VS2010后,我们发现一个最大的好处是实体对象不再需要我们自己编写了,加上调用存储过程智能感知的支持,确实非常方便。

5 结束语

本文通过教务管理系统,首先使用ADO.NET实现三层结构软件框架,在该技术中,三层结构之间数据传递的载体是DataSet。其次,为消除关系数据与类之间的差别,以便更好地使用面向对象的思想来实现我们的传统,我们介绍了使用实体类实现软件系统框架。再次,分析了微软的最新技术:LINQ TO SQL的概念和基本架构,对其核心技术和新特性进行了详细的描述。结合三层结构,详细介绍了LINQ TO SQL数据库访问的基本方法,如查询、修改、插入、删除等操作。最后,微软的主推框架:ADO.NET实体框架,以及如何在三层架构中使用实体框架,在实体框架结合VS2010后,我们发现一个最大的好处是实体对象不再需要我们自己编写了,加上调用存储过程智能感知的支持,确实非常方便。

相关推荐