一.什么是三层架构
三层架构是 C# 桌面开发中比较常用的框架,是由 表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构组成,目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率。
- 表示层(UI):这一层主要负责与用户进行交互,显示数据和接收用户输入。它可以是图形用户界面(GUI)或命令行界面(CLI),具体取决于应用程序的需求。表示层通常不包含任何业务逻辑或数据访问代码,而是依赖于业务逻辑层和数据访问层来获取数据和执行操作。
- 业务逻辑层(BLL):业务逻辑层是应用程序的核心,包含了所有的业务规则和逻辑。它负责处理表示层传来的请求,执行业务操作,并与数据访问层交互以获取或存储数据。业务逻辑层通常包含一些业务实体和业务服务,用于实现具体的业务功能。
- 数据访问层(DAL):数据访问层负责与数据库进行交互,执行数据的添加、删除、修改和查询等操作。它通常包含一些数据访问对象和数据访问服务,用于封装数据库访问的细节。数据访问层与具体的数据库系统无关,因此可以轻松地更换数据库系统而不需要修改业务逻辑层和表示层的代码。
三层为窗体界面展示层(UI),业务逻辑层(BLL),数据访问层(DAL),三个层的任务明确。同时有一个穿越在三个层中间的Model,也就是承载数据的实体类,
如果各层的内容比较多,也可以按功能范围再加一层文件夹。当然也可以先按功能范围分成几个文件夹,然后再在里面创建三个层也可以。
很多时间,我们的WinForm不只三层,常见的有与三方交互,不管是调用web api还是调用dll,我们可以再创建一层API层,在BLL层与之交互即可。
还有的时候,会定义很多工具类,通用类,这时,一般会建一个Common文件夹,来定义各种工具类。
二.搭建三层架构
新建一个.net的winfrom项目,以登陆功能作为演示,界面如下:
1.存储数据库字段(Model)
添加一个 .net 类库,取名 Model(存储数据库字段),在里面添加一个类 UserInfo
代码如下:
namespace Model
{
public class UserInfo
{
public string? UserName { get; set; }
public string? Password { get; set; }
}
}
2. 数据访问层(DAL)
这一层主要负责与数据库进行交互。它通常包含了与数据库操作有关的所有方法,例如CRUD(创建,读取,更新,删除)操作。
这是一个简单的DAL示例:
public class EmployeeDAL
{
private string connectionString;
public EmployeeDAL(string connectionString)
{
this.connectionString = connectionString;
}
public DataTable GetEmployees()
{
// 这里应当包含连接数据库,执行查询,并返回结果的代码。
}
public void InsertEmployee(string name, string position)
{
// 这里应当包含连接数据库,执行插入操作,并提交更改的代码。
}
}
3. 业务逻辑层(BLL)
业务逻辑层是应用程序的核心层,它包含了所有的业务规则和逻辑。这一层通常会使用DAL来执行数据库操作。
这是一个简单的BLL示例:
public class EmployeeBLL
{
private EmployeeDAL dal;
public EmployeeBLL(string connectionString)
{
dal = new EmployeeDAL(connectionString);
}
public DataTable GetEmployees()
{
return dal.GetEmployees();
}
public void InsertEmployee(string name, string position)
{
dal.InsertEmployee(name, position);
}
}
4. 用户界面(UI)
表示层或用户界面是用户与应用程序交互的地方。这一层通常包含了所有的窗体和用户界面元素。它通常会使用BLL来执行应用程序逻辑。
这是一个简单的窗体示例:
public partial class EmployeeForm : Form
{
private EmployeeBLL bll;
public EmployeeForm()
{
InitializeComponent();
bll = new EmployeeBLL("your-connection-string");
}
private void EmployeeForm_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = bll.GetEmployees();
}
private void button1_Click(object sender, EventArgs e)
{
bll.InsertEmployee(textBox1.Text, textBox2.Text);
dataGridView1.DataSource = bll.GetEmployees();
}
}
通过将应用程序划分为这三个层次,可以实现关注点分离(Separation of Concerns),使得每个层次可以独立地进行开发和测试,提高了代码的可维护性和可扩展性。同时,这种分层结构也使得代码更加模块化,可以更容易地进行重构和扩展。
三.总结
良好的扩展性、灵活性、可重用性是三层架构带来的优势,当业务逻辑需要修改时,只需关注某部分或者某几部分,而不用修改整个程序。让程序分层次,也增强了程序的可维护性。