ASP.NET三层架构应用总结(一)

前言:
与ASP相比ASP.NET在Web应用开发上无疑更容易,更有效率。Web开发大部分还是围绕着数据操作,建立数据库存储数据,编写代码访问和修改数据,设计界面采集和呈现数据。走过Asp.net学习入门阶段后,真正开始着手开发一个Web项目时,才发现错综复杂的数据与关联根本就不是SqlDataSource和AccessDataSource数据源控件能简单解决的,而恰恰是被忽视了的一个ObjectDataSource数据源控件才是真正踏入开发门槛的关键,由此也对三层架构模式有了初步体验。
一.ASP.NET三层架构介绍
设计模式中的分层架构(可以参考一下J2EE中MVC模式)实现了各司其职,互不干涉,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。这样就能更好的实现开发中的分工,有利于组件的重用。所以这些年关于模式的研究有很多成果,应用也很广泛。一个好的模式在程序开发和后期维护中作用重大。
ASP.NET三层架构自底向上分为:数据访问层(DAL),业务逻辑层(BLL)和表示层(PL)。
数据访问层(DAL):使用了一个强类型的DataSet作为数据访问层,只是单纯的对数据进行增,删,改,查询和判断存在等等较通用的数据访问方法(由SQL语句来提供),不应该有“事务”存在。
业务逻辑层(BLL):业务逻辑层是在数据访问层和表示层之间进行数据交换的桥梁,按业务需求调用数据访问层中的方法组合,集合了各种业务规则到一个BLL中,例如通过条件进行判断的数据操作或“事务”处理。BLL都是以类库(Class Library)的形式来实现的。
表示层(PL):表示层是为客户提供用于交互的应用服务图形界面,帮助用户理解和高效地定位应用服务,呈现业务逻辑层中传递的数据,用ASP.NET页面来实现。二.三层架构应用实现
随着ASP.NET 的不断升级,可以很方便的使用ASP.NET 来构建B/S 三层架构的应用程序,下面以“教师业务信息管理系统”项目中的部分例子来演示如何使用ASP.NET 2.0 和SQL Server 2005数据库来构建一个三层架构的应用程序。
1.创建数据库
打开SQL Server 2005,新建一个数据库“TeacherDb”,建立如下所示结构的两个表“PersonInfo”和“JobInfo”。两表以PersonIDNumber作为关联字段,存储18位身份证号码。
表名: PersonInfo  基本信息表
字段名 类型 说明 备注
ID int 主键,自增 
UserID uniqueidentifier 登录帐户ID 
TrueName nvarchar(20) 姓名 
PersonIDNumber nvarchar(18) 身份证 
Sex nvarchar(1) 性别 “男”或“女”
BirthDate datetime 出生日期 
Nation nvarchar(10) 民族 
NativePlace nvarchar(50) 籍贯 
Polity nvarchar(10) 政治面貌 
JoinPolityTime datetime 入党时间 
PersonImageUrl nvarchar(250) 相片地址 允许NULL
Telephone nvarchar(50) 联系电话 
MobiePhone nvarchar(50) 手机号码 
Email nvarchar(50) Email 
表名: JobInfo  职业信息表
字段名 类型 说明 备注
ID int 主键,自增 
PersonIDNumber nvarchar(18) 身份证号码 
Post1 nvarchar(20) 职务 
Post2 nvarchar(20) 职务2 第二职务
JoinTime datetime 参加工作时间 
CountryWorkedTime int 农村年限 
MasteSubject nvarchar(20) 学科 
SecondSubject nvarchar(20) 兼职学科 
SchoolPhase nvarchar(10) 学段 
MotherClassTime int 班主任年限 
SchoolID int 所在学校代码 
InPosition real 是否在职 
2.创建数据访问层
在开始创建数据访问层(DAL)之前,首先需要创建一个网站,配置好数据库链接。
第一步:创建一个Web项目,配置数据库连接
打开Visual Studio 2005(以下简称VS2005)集成开发环境, 首先创建一个C#语言的ASP.NET网站,并将其命名为WebSite,设置位置(Location)列表的选项为文件系统( File System),然后选这一个放置这个网站的文件夹,然后选择编程语言为C#。Visual Studio会为你生成一个新的网站,同时生成一个名为Default.aspx的网页,和一个App_Data文件夹。
 

第二步:创建数据访问层,配置数据库连接
接下来创建数据访问层,添加一个强类型的DataSet。在解决方案管理器里的项目节点上按右鼠标,选择“添加新项”,在模板列单里选择“数据集”,将其命名为DataSet1.xsd。接下来会出现“TableAdpater”配置向导的窗口,选择数据库服务器,设置好各项参数,并按照提示逐步完成。需要注意:
1.指定连接的数据库字符串,并选择将连接字符串保存到web.config文件中去。
2.命令类型选择“使用SQL语句”,通过“高级选项”选择“生成Insert、Update和Delete语句”,通过“查询生成器”生成要装载数据的“Select语句”。并为方法命名。
 
SELECT ID, UserID, TrueName, PersonIDNumber, Sex, BirthDate, Nation, NativePlace,
Polity, JoinPolityTime, PersonImageUrl, Telephone, MobiePhone, Email
FROM EM_P_PersonInfo
针对项目需求对数据库中各表查询操作分别建立各种方法,完成后的可能如下图。
 
跟底层数据源相关的所有编码,比如建立到数据库的连接,发出SELECT,INSERT ,UPDATE和DELETE命令等的编码,都应该放置在DAL中。表现层不应该包含对这些数据访问编码的任何引用,而应该调用DAL中的编码处理所有的数据访问请求。数据访问层包含访问底层数据库数据的方法。至此,清晰构建出数据访问层,之后可在“业务逻辑层”和“表示层”通过调用自动生成的TableAdpater及相关类来操作数据。由于“数据集”是强类型,对于数据库中的NULL数据需要使用方法来判断,这些内容在后续内容中再详细描述。
3.创建业务逻辑层
数据访问层(DAL)将数据访问的细节从表示层中分离出来了,可它却不能处理任何的业务规则。比如判断数据的有效性。这些工作将由业务逻辑层(简称BLL)来承担,在以下应用程序中,将BLL实现为App_Code文件夹中的一系列的类。每一个BLL类都对应DAL中的一个TableAdapter,它们都从各自的TableAdapter中得到读取、插入、修改以及删除等方法以应用合适的业务规则。
第一步:创建BLL类
在App_Code文件夹中创建2个类文件。在解决方案浏览器(Solution Explorer)中右键点击App_Code文件夹,并选择新建项目(New Item),然后在弹出的对话框中选择“类”模板(Class template)就可以创建新的类文件了。将这2个文件分别命名为UserBLL以及JobBLL。
 
第二步:通过BLL类访问类型化数据集
为UserBLL和JobBLL类分别添加如下方法:
(1) UserBLL.css
           updateUser(string UserName, String PersonIDNumber, int SchoolID, string Password, string Sex, string TrueName, bool InPosition)
           updateUser(String PersonIDNumber, string TrueName, string BirthDate, string Nation, string NativePlace, string Polity, string JoinPolityTime, string Telephone, string MobiePhone, string Email)
           getPersons(int SchoolID,string TrueName)
           getPersonByPID(string PersonIDNumber)
           deleteUser(string UserName, String PersonIDNumber, int? SchoolID)
           addUser(string UserName, String PersonIDNumber, int SchoolID, string Password, string Sex, string TrueName, bool InPosition)
(2)JobBLL.css
           getPersonJob(string PersonIDNumber)
           updateUser(String PersonIDNumber, string Post1, string Post2, string JoinTime, int? CountryWorkedTime, string MasteSubject, string SecondSubject, string SchoolPhase, int? MotherClassTime)
以下为JobBLL.css的代码(UserBLL.css的代码太长,不列出)

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using TeacherTableAdapters;

/// <summary>
/// JobBLL 的摘要说明
/// </summary>

[System.ComponentModel.DataObject]
public class JobBLL
{
    private JobInfoTableAdapter _JobAdapter = null;

 public JobBLL()
 {
  //
  // TODO: 在此处添加构造函数逻辑
  //
 }

    protected JobInfoTableAdapter Adapter
    {
        get
        {
            if (_JobAdapter == null)
                _JobAdapter = new JobInfoTableAdapter();

            return _JobAdapter;
        }
    }

    //select
    [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]
    public Teacher.JobInfoDataTable getPersonJob(string PersonIDNumber)
    {
        return Adapter.GetPersonJobByPID(PersonIDNumber);
    }

    //update
    [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, false)]
    public bool updateUser(String PersonIDNumber, string Post1, string Post2, string JoinTime, int? CountryWorkedTime, string MasteSubject, string SecondSubject, string SchoolPhase, int? MotherClassTime)
    {
        if (string.IsNullOrEmpty(PersonIDNumber))
        {
            return false;
        }
       
        try
        {
       
            Teacher.JobInfoDataTable PersonJob = Adapter.GetPersonJobByPID(PersonIDNumber);
            Teacher.JobInfoRow PersonJobPID;

            if (PersonJob.Count == 1)
            {
                PersonJobPID = PersonJob[0];
            }           
            else
            {
                return false;
            }

            if (!string.IsNullOrEmpty(Post1))
            {
                PersonJobPID.Post1 = Post1;
            }
            else
            {
                PersonJobPID.SetPost1Null();
            }
            if (!string.IsNullOrEmpty(Post2))
            {
                PersonJobPID.Post2 = Post2;
            }
            else
            {
                PersonJobPID.SetPost2Null();
            }
            if (!string.IsNullOrEmpty(MasteSubject))
            {
                PersonJobPID.MasteSubject = MasteSubject;
            }
            else
   

阅读更多

没有更多推荐了,返回首页