什么是三层架构?
三层在物理上划分为:显示层、业务层、数据层
在逻辑上分为:UI/BLL + DAL/DB
我们在此所说的三层结构为:
UI(User Interface):显示和采集用户操作。
BLL(Business Login Layer):处理业务逻辑,通过获取U层传来的操作指令,决定业务逻辑,在访问数据源的时候直接交给D层处理,处理完成后返回必要数据给U层。
DAL(Data Access Layer):只提供最基本的数据访问。
实体Model层:保存实体以及传输数据。实体层不包含于任何一层。
具体应用:UI→BLL→DAL
①DAL所在的程序集不引用BLL和UI
②BLL需要引用DAL
③UI直接引用BLL,间接引用DAL,不能直接饮用DAL
④每一层都需要引用实体Model层
三层架构如何写(以登录为例)
-
首先我们需要建立四个类库,其中包括三层结构和实体层
-
在U层建立一个From窗体,如图所示
U层代码:
private void btnLogin_Click_1(object sender, EventArgs e)
{
//显示层不能直接跟数据源打交道
string userName = txtUserName.Text .Trim ();
string password = txtPassword.Text;
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();//构造实例
Login.Model .UserInfo user = mgr.UserLogin(userName ,password );
MessageBox.Show("登录用户:" + user.UserName);
}
- B层代码:
public class LoginManager
{
//根据用户的需要,使用了用户登录的方便
public Login.Model.UserInfo UserLogin(string userName, string Password)
{
//throw new NotFiniteNumberException();
//需要用到数据源,把数据源调来
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.UserInfo user = uDao.SelectUser(userName, Password);
if (user != null)//登陆成功
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登陆失败");
}
}
}
4.D层与数据建立联系
首先需要在D层新建三个类分别为
①DUtil类
class DbUtil
{
public static string ConnString = @"Server = LAPTOP-4EF4CAKC; Database = Login ; User ID = sa;Password = 123";
//数据库的账户和密码
}
②ScoreDAO类
public class ScoreDAO
{
//积分对象 增加积分
public void UpdateScore(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DbUtil .ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO SCORES(UserName, Score) Values(@UserName,@Score)";
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score", value));
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
③UserDAO类
public class UserDAO
{
//用户
public Login.Model.UserInfo SelectUser(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID,UserName,Password,Email
FROM USERS WHERE UserName = @UserName AND Password = @Password ";
cmd.CommandType = CommandType.Text;
//添加
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Password", password));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
Login.Model.UserInfo user = null;
while (reader.Read())
{
if (user==null)
{
user = new Login.Model.UserInfo();
}
user.ID = reader.GetInt32(0);
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);
if (!reader.IsDBNull (3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
5.Model层里写实体
namespace Login.Model
{
public class UserInfo
{
//所用到的数据库中的字段
public int ID {
get; set; }
public string UserName {
get; set; }
public string Password {
get; set; }
public string Email {
get; set; }
}
}
登录成功!
使用三层架构的好处
- 避免了表示层直接访问数据访问层,表示层只和业务逻辑层有联系,提高了数据安全性。
- 高内聚、低耦合降低了层与层之间的依赖。
- 项目结构更清楚,分工更明确,有利于后期的维护和升级。
- 每一个层可以由不同的人员来开发,只要遵循接口标准,利用相同的对象模型实体类就可以了,这样就可以大大提高系统的开发速度。
(比如机房合作项目)