一个简单的三层架构

三层架构学习
## 基础
一、相关概念:
1. 三层划分:DAL(数据层) BLL(业务逻辑层) UI(界面层)
2. DAL层:对非原始数据的操作层,比如对数据库的操作,为业务逻辑层(BLL)和界面层(UI)提供数据服务,为业务逻辑层(BLL)根据业务场景需求二次操作数据提供接口。该层中封装了一些数据库的基本操作方法(增删改查),但是这些这些方法通过构造SQL语句实现数据的增删改查,返回不同格式(DataSet、Model层的数据对象、List)的数据给BLL层。
3. BLL层:将UI层的界面规则的数据需求简单处理后以参数的形式传递给DAL层。
4. UI层:WebForm中分为界面外观层(.aspx)和界面规则层(.aspx.cs),用户在aspx页面上进行交互,产生数据需求,传递给界面规则层(.aspx.cs),在传递给BLL层。
5. Model层:也被称为Entity层,即实体层。该层不属于逻辑上的三层划分,在不严谨的情况下可以简单理解为三层之间连接的桥梁,负责将【数据表或者是视图】抽象成为实体对象,数据表中的数据项抽象成数据对象的属性。UI层向BLL层,BLL层向DAL层之间的数据传递通过该成抽象出的实体来作为参数进行传递。这样构造了三层之间的联系。
二、示例图(辅助理解):
1. WebForm配合三层示例图:

2. 三层之间的相互引用:

## 手动搭建一个简单的三层Demo
1. 功能实现:
数据库中建一张数据表,实现基本的数据查询展示。
2. 建数据库Demo,添加数据建简单表UserInfo,其中字段ID
数据项为自增项

向表中添加两条数据

3. 新建一个解决方案

4. 添加三层项目
(1)添加类库项目Model层

(2)添加类库项目DAL层

(3)添加类库项目BLL层

(4)添加窗体应用程序Web

(5)将Web设置为启动项目
5. 添加各层之间的引用
(1)设置各项目依赖项:右击解决方案,选择属性,通用属性,项目依赖项。




(2)为各层添加引用,引用关系:
Model 不引用任何层
DAL层 引用 Model层

BLL层引用DAL和Model层

Web层引用BLL和Model层

6. Model层完成
(1)将Model层中Class1.cs文件重命名为UserInfo.cs
(2)添加类和属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model
{
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string UserPwd { get; set; }
public DateTime RegTime { get; set; }
public string Email { get; set; }
}
}


(3)右击Model项目,重新生成。
7. DAL层完成
(1)配置连接字符串
服务器资源管理器中添加数据库的连接

右击新添加的数据连接,查看属性中的连接字符串DataSource,复制粘贴到Web项目中的Web.config文件中的connectionString中。

(2)DAL层,添加System.Configuration引用

(3)DAL层,新建一个SQLHelper.cs,用于数据库的连接和简单的SQL执行
(4)编写SQLHelper.cs,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//下面三个自行添加
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
public class SQLHelper
{
///

/// 数据库连接字符串
///

private static readonly string connStr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
///

/// 查询通用操作方法
///

/// /// /// /// DataTable
public static DataTable GetTable(string sql, CommandType type, params SqlParameter[] pars)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlDataAdapter atper = new SqlDataAdapter(sql, conn))
{
atper.SelectCommand.CommandType = type;
if (pars != null)
{
atper.SelectCommand.Parameters.AddRange(pars);
}
DataTable da = new DataTable();
atper.Fill(da);
return da;
}
}

}
///

/// 增删改通用操作
///

/// /// /// /// 影响的行数
public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] pars)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandType = type;
if (pars != null)
{
cmd.Parameters.AddRange(pars);
}
conn.Open();
return cmd.ExecuteNonQuery();
}
}
}
}
}

(5)DAL层,新建一个UserInfoDAL.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//下面的自行添加
using Model;
using System.Data;

namespace DAL
{
public class UserInfoDAL
{
///

/// 返回用户列表
///

///
public List GetList()
{
string sql = "select * from UserInfo";
DataTable da = SQLHelper.GetTable(sql, CommandType.Text);
List list = null;
if (da.Rows.Count>0)
{
list = new List();
UserInfo userInfo = null;
foreach (DataRow row in da.Rows)
{
userInfo = new UserInfo();
LoadEntity(row,userInfo);//将row行中查询到的所有数据都给userInfo实体对象,数据项对应属性
list.Add(userInfo);
}
}
return list;
}
///

/// 将行中的数据都给实体对象
///

/// /// private void LoadEntity(DataRow row,UserInfo userInfo)
{
userInfo.UserName = row["UserName"] != DBNull.Value ? row["UserName"].ToString() : string.Empty;
userInfo.UserPwd = row["UserPwd"] != DBNull.Value ? row["UserPwd"].ToString() : string.Empty;
userInfo.Email = row["Email"] != DBNull.Value ? row["Email"].ToString() : string.Empty;
userInfo.ID= Convert.ToInt32(row["ID"]);
userInfo.RegTime = Convert.ToDateTime(row["RegTime"]);

}

}
}

(6)右击DAL项目,重新生成
8. BLL层完成
(1)BLL层添加一个UserInfoBLL.cs类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以下自行添加
using Model;
using DAL;

namespace BLL
{
public class UserInfoBLL
{
DAL.UserInfoDAL UserInfoDal = new DAL.UserInfoDAL();
public List GetList()
{
return UserInfoDal.GetList();//因为这里不需要根据业务进行二次处理,可以直接返回DAL层中的List
}
}
}

(2)右击BLL项目,重新生成
9. Web层完成
(1)新建一个web窗体,命名为User.aspx,向body中拖入一个GridView控件,ID为GridView1
(2)编写User.aspx.cs后台逻辑文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//以下须自行添加
using BLL;
using Model;

namespace Web
{
public partial class User : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
bindData();
}
}
private void bindData()
{
UserInfoBLL userInfoBLL = new BLL.UserInfoBLL();//实例化BLL中对象
List user = userInfoBLL.GetList();//使用BLL中对象方法,获取数据
GridView1.DataSource = user;//指定控件数据源
GridView1.DataBind();//数据绑定
}
}
}

10.运行调试:

## 通过动软生成器生成器搭建一个简单的Demo
1. 数据库使用以上使用的实例数据库FirstDemo,数据库中的数据表和数据项都不变

2. 动软代码生成器直接使用百度软件中心的下载安装即可。

3. 打开动软代码生成器,添加服务器:

4. 添加完成,左侧服务器会自动加载所有数据表,可以看到FirstDemo数据库。

5. 新建简单三层项目:

6. 生成项目

7. 打开项目生成的文件夹,打开项目解决方案,如果使用的是搞版本的VS打开会进行项目的迁移。
8. 动软生成器生成的简单三层与手动建的三层相比,多了一个DBUtility项目,生成器是把手动建立的DAL层中的DBHelper.cs类剥离出来,添加了其他类型数据库连接访问方法,比如Oracle/MySQL等

9.DAL、Model、BLL层的原理与手动建立的一致,只是将所有可能用到的方法都帮我们写好了,包括增删改查在每一层的实现,都有,更加方便。

10. BLL层的UserInfo文件:

11. DAL层的UserInfo.cs文件

12.在Web项目中的Web.config文件中将连接字符串配置上,添加个页面User.aspx,拖入GridView控件,并完成该页面对应的后台代码.cs文件:

using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace FirstDemo.Web
{
public partial class User : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
bindData();
}
}

private void bindData()
{
FirstDemo.BLL.UserInfo userInfo = new BLL.UserInfo(); //实例化BLL中对象
DataSet user = userInfo.GetAllList();//注意:这里与手动建立的项目不同,使用BLL层的GetAllList方法,直接返回的数据集
GridView1.DataSource = user;//指定控件数据源
GridView1.DataBind();//数据绑定
}

}
}

11.运行项目:

feihu分享到:

          

You may also like...

Scroll Up