三层架构
三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。 三层架构区分层次的目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。
数据访问层(DAL),负责数据库的交互。
业务逻辑层(BLL),封装业务规则和逻辑。
表示层(UI),负责用户界面的展示。
模型类(Model),存储数据模型类
一个项目如果用到了三层架构,这就必然要涉及到数据库,
运行流程:
用户通过界面层(UI)交互。
UI发送命令至业务逻辑层。
业务逻辑层根据需要处理数据,可能会与数据访问层交互。
数据访问层负责直接与数据库交互,执行数据的CRUD操作。
处理完毕后,业务逻辑层将结果返回给UI层。
优点:
分工明确:每一层都有明确的职责分工,便于团队开发和维护。
可测试性:每一层都可以单独进行测试,提高了代码的可测试性。
可维护性:每一层的改动不会影响到其他层,降低了维护难度。
灵活性:三层架构允许开发者灵活地更换任何一层,如更换UI层或者数据库层。
性能优化:通过优化DAL层,可以提高数据访问的性能。
实现三层架构
创建架构
使用类库
Model
添加一个 .net6 类库,取名 Model(存储数据库字段),在里面添加一个类 UserInfo
namespace Model
{
public class UserInfo
{
public string? UserName { get; set; }
public string? Password { get; set; }
}
}
DAL
添加一个 .net6 类库,取名 DAL(数据访问层),在里面添加一个类 SqlServerHelper,这里看你用的什么数据库,如果是 mysql 就用 mysql 的查询方式,c# 查询 mysql 和 sqlserver 数据库我都有写相关的教程,有需要的可以去看看
using System.Data;
using System.Data.SqlClient;
namespace SqlServer
{
internal class SqlServerHelper
{
/// <summary>
/// 连接字符串
/// </summary>
private string strconn = string.Empty;
public SqlServerHelper(string conn)
{
//读取配置文件
//strconn = ConfigurationManager.AppSettings["Conn"].ToString();
//strconn = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
strconn = conn;
}
/// <summary>
/// 执行增删改SQL语句
/// </summary>
/// <param name="cmdText">SQL语句</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText)
{
using (SqlConnection conn = new SqlConnection(strconn))
{
conn.Open();
return ExecuteNonQuery(conn, cmdText);
}
}
}
}
BLL
添加一个 .net6 类库,取名 BLL(业务逻辑层),由于后面的代码需要获取到数据库数据,所以要添加 DAL 和 Model 程序集 的引用
using DAL;
using Model;
using System.Data;
namespace BLL
{
public class LoginHandle
{
/// <summary>
/// 用户登录
/// </summary>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <returns>是否能够登录</returns>
public static bool UserLogin(string username, string password)
{
DataTable dataTable = UserHandle.UserLogin(username, password);
if (dataTable == null || dataTable.Rows.Count == 0)
{
Console.WriteLine("查询的数据为空");
return false;
}
string? user = dataTable.Rows[0][0].ToString();
string? pwd = dataTable.Rows[0][1].ToString();
if (username.Equals(user) && password.Equals(pwd))
{
return true;
}
return false;
}
/// <summary>
/// 获取用户的所有数据
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public static UserInfo? GetUserData(string username)
{
DataTable dataTable = UserHandle.GetUserData(username);
if (dataTable == null || dataTable.Rows.Count == 0)
{
Console.WriteLine("查询的数据为空");
return null;
}
UserInfo userInfo = new UserInfo();
userInfo .UserName = dataTable.Rows[0][0].ToString();
userInfo .Password = dataTable.Rows[0][1].ToString();
return userInfo;
}
}
}
UI
I层就是创建项目时的 winform 项目,上面的工作完成后,配置大概就如下界面,需要将 BLL和 Model 层添加进来
using BLL;
using Model;
namespace 三层架构Demo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Button_Login_Click(object sender, EventArgs e)
{
string username = TextBox_UserName.Text;
string password = TextBox_Password.Text;
if(string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
{
Console.WriteLine("输入框不能为空");
return;
}
//第一种方式
bool result = LoginHandle.UserLogin(username, password);
if(result)
{
Console.WriteLine("登录成功!");
//跳转界面
//....
}
else
{
Console.WriteLine("登录失败");
}
//第二种方式
UserInfo? userInfo = LoginHandle.GetUserData(username);
if(userInfo != null)
{
if(userInfo.Password != password)
{
Console.WriteLine("密码不正确");
return;
}
Console.WriteLine("登录成功!");
}
}
}
}