项目三层架构详情

三层架构

三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(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("登录成功!");
                }
            }
        }
    }

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 13:32:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 13:32:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 13:32:05       58 阅读
  4. Python语言-面向对象

    2024-07-12 13:32:05       69 阅读

热门阅读

  1. DangerWind-RPC-framework---四、SPI

    2024-07-12 13:32:05       20 阅读
  2. OpenCV:解锁计算机视觉的魔法钥匙

    2024-07-12 13:32:05       20 阅读
  3. 使用sklearn的基本流程

    2024-07-12 13:32:05       21 阅读
  4. qt udp 只创建服务端链接

    2024-07-12 13:32:05       24 阅读
  5. 开发不认可bug策略

    2024-07-12 13:32:05       22 阅读
  6. 深入理解sklearn中的模型参数优化技术

    2024-07-12 13:32:05       23 阅读
  7. Android C++系列:Linux守护进程

    2024-07-12 13:32:05       20 阅读
  8. hive中reverse函数

    2024-07-12 13:32:05       21 阅读
  9. 03-NoSQL之Redis配置与优化

    2024-07-12 13:32:05       15 阅读
  10. 编程是学什么:探索编程世界的四大核心领域

    2024-07-12 13:32:05       19 阅读
  11. npm error code 1

    2024-07-12 13:32:05       18 阅读
  12. npm link,npm unlink调试本地开发npm包

    2024-07-12 13:32:05       18 阅读
  13. Dubbo之SPI、Adaptive机制详解

    2024-07-12 13:32:05       21 阅读
  14. linux上mmm和mm指令的区别

    2024-07-12 13:32:05       23 阅读