ASP.NET 三层架构详解(转)

一、三层架构的介绍:

三层架构,是为了便于我们开发项目后维护及变更的一种有效而实用的架构模式,在各种B/S项目中被广泛的采用着.

首先让我们来认识一下三层结构及每一层之前的作用和调用关系。

三层,即:

数据访问层(DAL):主要是对数据的增、删、改、查操作。

业务逻辑层(BLL):包含了项目中的业务逻辑,负责调用DAL中的方法实现业务的处理,并在表示层与数据访问层之间起到衔接的作用。

表示层(WebUI):用于显示数据和接受用户输入数据的一层,即为用户界面。

 

二、三层架构的实现:

1、将表抽象成模型

首先让我们以一个用户注册的例子来为大家举例,并通过这一例子进而了解三层架构应用

现有数据库Database,表与字段如下:

Admin 用户表 

AdminId 用户Id int 自增长 PK

UserName 用户名 nvarchar(50)

PassWord 密码 nvarchar(50)

RoleId 角色Id int FK->Role表

 

Role 角色表

RoleId 角色Id int 自增长 PK

RoleName 角色名称 nvarchar(50)

 

好了,现在我们已知了两张表及其字段,下面我们可以将其抽象成类以便于我们以对象的形式在各个层之间的传输和调用(我们把与表对应的类单独建一个类库存储,并命名为Models,即模型)

*注:以下代码全部省略命名空间引用部份,见谅

[Serializable] //序列化便于传输
    public class Admin //与表明对应的类名
    {
        private int adminId; //字段抽象成属性

        public int AdminId //封装字段
        {
            get { return adminId; }
            set { adminId = value; }
        }
        private string userName;

        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
        private string passWord;

        public string PassWord
        {
            get { return passWord; }
            set { passWord = value; }
        }
        private Role role;  //由于主外键关系,我们将外键的引用以对象的形式保存在主键体现的类中

        public Role Role
        {
            get { return role; }
            set { role = value; }
        }
    }

*Role类的代码省略

至此,我们已经将业务中所用到的表抽象为了两个类以便于我们操作,下面,是书写IService接口的时候了~

2、写好接口,便于规范DAL方法(我们在这里将接口的类库命名为IService)

有了Models提供的类,我们可以根据类来书写接口了,由于我们只以用户的注册为例,所以我们在这里只书写两个方法

    public interface IAdminService
    {
        int AddAdmin(string userName,string passWord,int roleId); //根据用户名密码和选择的角色来注册
        int AddAdmin(Admin admin); //根据一个用户对象进行注册
    }

接口是一个方法的规范,它不需要具体的实现,只需要描述一个方法的参数和返回值即可,是不是很简单呢?有了这些方法的接口,我们就该写实现类了

 

 3、遵循接口,实现DAL方法

有了接口,我们下面来真正的开始写数据库操作的方法

*注省略传统的SqlHelper方法(即通用的数据库类,其中包含数据库的连接方法和基本增删改查方法,与业务无关),我们讲以业务方法为主要介绍对象

 public class AdminService:IAdminService //实现IAdminService接口
    {

        public int AddAdmin(string userName, string passWord, int roleId) //实现AddAdmin方法 参数 用户名密码 角色Id
        {
            string strSQL = "spAddAdmin"; //调用存储过程
            SqlParameter[] paras = new SqlParameter[] //设置存储过程参数数组
            {
                new SqlParameter("@UserName",userName),
                new SqlParameter("@PassWord",passWord),
                new SqlParameter("@RoleId",roleId)
            };
            return SqlHelper.ExecuteCommand(strSQL, paras); //调用SqlHelper类的通用更新方法
        }

        public int AddAdmin(Admin admin) //同上 参数用户对象
        {
            string strSQL = "spAddAdmin";
            SqlParameter[] paras = new SqlParameter[]
            {
                new SqlParameter("@UserName",admin.UserName),
                new SqlParameter("@PassWord",admin.PassWord),
                new SqlParameter("@RoleId",admin.Role.RoleId)
            };
            return SqlHelper.ExecuteCommand(strSQL, paras);
        }

    }

OK,至此,我们的DAL层中的类书写完毕,下面我们来一起看一看它们是如何在BLL层中调用并传递给WebUI的吧~

 

4、BLL层调用DAL,传递至WebUI

我们现在已经有了在DAL中对于用户注册的方法,下面我们只需要书写一个用户的业务类,并且调用该方法即可实现用户的注册功能(我们把这些方法统一放在一个名为BLL的类库中)

 

     public class AdminManager //BLL中Admin的业务类名
    {

        [DataObjectMethod(DataObjectMethodType.Insert)]  //声明该方法类型为插入
        public static int AddAdmin(string username, string password, int roleid)//静态用户注册方法,提供用户名 密码 角色Id 3参数,返回int型便于表示层判断
        {

            AdminService as = new AdminService();  //创建一个DAL中的AdminService类对象

            return as.AddAdmin(username,password,roleId); //调用DAL方法执行注册
            //return AbstractFactory.ChooseFactory().CreateAdminService().AddAdmin(username, password, roleid); //通过抽象工厂,调用DAL中的静态方法 抽象工厂会在后面作为拓展介绍
        }

 

        [DataObjectMethod(DataObjectMethodType.Insert)] //同上
        public static int AddAdmin(Admin admin) //静态用户注册方法 提供用户对象参数返回int型
        {

           

            AdminService as = new AdminService();

            return as.AddAdmin(username,password,roleId); //调用DAL方法执行注册
            //return AbstractFactory.ChooseFactory().CreateAdminService().AddAdmin(admin);
        }

     }

 全部的业务我们都已经完成了,下面,我们唯一要做的就是在表示层中看一看它们如何调用BLL的,并且如何处理返回的结果的

 

5、表示层的应用

表示层所关注的仅仅是BLL层中的方法,因此,我们在表示层中也只需引用BLL层,然后调用方法即可,我们仍旧继续我们的登录操作,请看代码:

    protected void btnLogin_Click(object sender, EventArgs e) //按钮点击提交方法
    {
        if (AdminManager.AddAdmin(txtUserName.Text, txtPassWord.Text,txtRoleId.Text) > 0) //调用BLL中的方法,判断是否注册成功
        {

            //注册成功
            HttpCookie cookieTime = new HttpCookie("LoginInfo"); //写入Cookie 下略,在这里我们只关注三层
            cookieTime.Values["LoginTime"] = DateTime.Now.ToString();
            cookieTime.Values["LoginAddress"] = Request.UserHostAddress;
            cookieTime.Expires = DateTime.Now.AddDays(3);
            Response.Cookies.Add(cookieTime);

            Session["AdminInfo"] = AdminManager.AdminLogin(txtUserName.Text, txtPassWord.Text)[0];

            Response.Redirect("~/Default.aspx"); //跳转页
        }
        else //注册失败
        {
            Response.Write("注册失败"); //提示信息
        }
    }

 

致此,关于Asp.net的3层架构就全部介绍完了

我们来将其要点和调用关系在汇总一下

首先我们要讲数据库的每个表抽象成一个对应的类,如果有主外键关系,则以对象的形式引用(Models)

然后,我们开始书写规范DAL方法的接口,在这里我们需要考虑到所用到的参数和返回值(IService)*引用Moldes

有了接口,我们可以就去实现DAL中的相对应方法了(DAL)*引用Moldes 引用IService

然后,我们在BLL层中,我们调用DAL中的方法 *引用Models 引用DAL(如果采用抽象工厂模式,则引用IService)

最后,我们在视图层中调用BLL中的业务方法,实现3层之间相互的业务调用 *仅引用BLL

 

关于3层架构就介绍到这里,关于抽象工厂,稍晚时候将做介绍,谢谢~

posted @ 2012-12-29 09:51  WsHiteam  阅读(667)  评论(0编辑  收藏  举报