三层简介
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。
区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
让我们亲自来到生活理解一下三层:
引用关系:UI引用BLL,BLL引用DAL,UI、BLL、DAL引用MODEL
DAL层
- 从数据源加载数据(Select)
- 向数据源写入数据(Insert/ Update)
- 从数据源删除数据(Delete)
- DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理。
例如机房登录:
///连接数据库
public class DbUtil
{
public static string ConnString = @"Server=DESKTOP-OU60RPC\SQLSV; Database=Login;UserID=sa;Password=123456";
//server:SQL中的服务器名字,Database:是本用户服务器名字,User ID:为什么空行还请期待吧。后面账号和密码就是SQLserver的。
}
/// 连接数据库并增加创建的角色
public class ScoreDAO
{
//updateScore方法需要传入userName和value两个参数
public void UpdateScore(string userName, int value)
{
//实例化数据库连接conn
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//利用现有连接conn创建一个Command,用于执行SQL指令。
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";
//数据库中增加新的数据,Score+10
cmd.Parameters.Add(new SqlParameter("@userName",userName));
cmd.Parameters.Add(new SqlParameter("@Score",value ));
conn.Open();
//执行SQL指令
cmd.ExecuteNonQuery();
}
}
}
/// 创建连接
public class UserDAO
{
//设定了两个参数,返回值类型为login.Model.UserInfo , 不要设置为bool
public Login.Model.UserInfo SelectUser(string userName, string password)
{
//using 作用为:可以自动关闭数据库
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//建立一个查询,利用一个现有链接conn创建一个Command,用于执行SQL指令。
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID,UserName,password,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password";
//将SQL语句赋值给cmd.commandtext
cmd.CommandType = System.Data.CommandType.Text; //CommandType.Text
cmd.Parameters.Add(new SqlParameter("@UserName",userName));
cmd.Parameters.Add(new SqlParameter("@Password",password ));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();//逐条的读取数据 使用ExecuteReader()方法返回一个对象用reader接收
Login.Model.UserInfo user = null; //定义user为Null
//设置循环把值传给user
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 ;
}
}
}
BLL 层
- 从DAL中获取数据,以供UI层显示
- 从UI中获取用户指令和数据,执行业务逻辑
- 从UI中获取用户指令和数据,通过DAL写入数据源
- BLL负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。
例如机房登录:
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{
//实例化D层
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.UserInfo user = uDao.SelectUser(userName, password);
//如果user不为空值
if (user !=null ) //登录成功
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//实例化D层
sDao.UpdateScore(userName, 10);//更新积分
return user;//返回user到U层
}
else
{
throw new Exception("登录失败");
}
}
}
UI层
- 向用户展示特定业务数据
- 采集用户的输入信息和操作
- 原则:用户至上,兼顾简洁
- UI只负责显示和采集用户操作,不包含任何地业务相关的逻辑处理。
例如机房登录:
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
MODEL
业务数据模型,用于传输数据。
例如机房登录:
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
机房登录简单异
- sqlconnection 显示问题; 解决办法:引用using system.data.sqlclient
解决办法:数据库连接问题,在DBUtil层里面的UserID=sa 写成:User ID =sa