项目三层架构详情

三层架构

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UDP网络通信(发送端+接收端)实例 —— Python

简介 在网络通信编程中&#xff0c;用的最多的就是UDP和TCP通信了&#xff0c;原理这里就不分析了&#xff0c;网上介绍也很多&#xff0c;这里简单列举一下各自的优缺点和使用场景 通信方式优点缺点适用场景UDP及时性好&#xff0c;快速视网络情况&#xff0c;存在丢包 与嵌入…

Windows终端远程登陆Linux服务器(SSH+VScode)

W i n d o w s 终端远程登陆 L i n u x 服务器&#xff08; S S H V S c o d e &#xff09; \huge{Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09;} Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09; 文章目录 写在前面通过SSH远程连接L…

Postman下载及使用说明

Postman使用说明 Postman是什么&#xff1f; ​ Postman是一款接口对接工具【接口测试工具】 接口&#xff08;前端接口&#xff09;是什么&#xff1f; ​ 前端发送的请求普遍被称为接口 ​ 通常有网页的uri参数格式json/key-value请求方式post/get响应请求的格式json 接…

@google/model-viewer 导入 改纹理 (http-serve)

导入模型 改纹理 效果图 <template><div><h1>鞋模型</h1><model-viewerstyle"width: 300px; height: 300px"id"my-replace-people"src"/imgApi/Astronaut.glb"auto-rotatecamera-controls></model-viewer>&…

网络分层及通信过程

网络分层体系 主流的理论体系中主要包含三种网络分层模型&#xff0c;即ISO的七层网络模型、TCP/IP的四层网络模型以及结合两种模型优点的五层网络模型&#xff0c;关于网络模型&#xff0c;主要起到对网络体系的一个整体认识&#xff0c;作为网络知识学习的开始&#xff0c;这…

【Python进阶】正则表达式、pymysql模块

目录 一、正则表达式的概述 1、基本介绍 2、快速使用re模块 二、正则的常见规则 1、匹配单个字符 2、原始字符串 3、匹配多个字符 4、匹配开头和结尾 5、匹配分组 三、Python与MySQL交互 1、pymysql模块的安装 2、pymysql的操作步骤 3、connection对象 4、cursor…

【Git从入门到精通】——Git常用命令总结

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

购物系统 (GUI)

一、前言 1 研究背景 随着电子商务的快速发展&#xff0c;越来越多的消费者选择在网上购物。为了提高用户体验、提升交易效率和管理便捷性&#xff0c;许多企业和个人开始开发和使用各种类型的购物系统商城。而基于Java Swing的购物系统商城正是应运而生的一种应用。Java Swi…

C++中链表的底层迭代器实现

大家都知道在C的学习中迭代器是必不可少的&#xff0c;今天我们学习的是C中的链表的底层迭代器的实现&#xff0c;首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别&#xff0c;为什么顺序表的底层迭代器更加容易实现&#xff0c;而链表的底层迭代器…

更换Mac硬盘后如何将数据恢复到新驱动器?

在本文中&#xff0c;我们将分享几种在用新 Mac 硬盘替换旧 Mac 硬盘后从旧 Mac 硬盘恢复数据的方法。 您是否最近由于存储空间不足或损坏问题而必须更换新的Mac硬盘&#xff1f;是否要将受影响驱动器中的数据恢复到新驱动器&#xff1f;我们可以帮忙&#xff01;但是&#xf…

线性代数|机器学习-P24加速梯度下降(动量法)

文章目录 1. 概述2. 引入3. 动量法梯度下降 1. 概述 我们之前学的最速梯度下降[线搜索方法] 公式如下&#xff1a; x k 1 x k − s k ∇ f ( x k ) \begin{equation} x_{k1}x_k-s_k\nabla f(x_k) \end{equation} xk1​xk​−sk​∇f(xk​)​​ 但对于这种方法来说&#xff…

手机数据恢复篇:如何从 Android 设备内恢复数据

如何从 Android 内部存储恢复数据&#xff1f; 要从 Android 内部存储恢复已删除的文件&#xff0c;您需要一个 Android 内部存储恢复应用或程序。请继续阅读以获取可靠的 Android 数据恢复软件&#xff0c;并让它帮助您从 Android 手机的内部存储恢复数据。 是否有可能恢复 An…

【vue3-命名规范以及注意事项】

使用多字组件名 使用详细的道具定义props 在提交的代码中&#xff0c;prop定义应该总是尽可能详细&#xff0c;至少指定类型。 在声明期间&#xff0c;道具名应该始终使用camelCase。当在in-DOM模板中使用时&#xff0c;props应该是串式的。单文件组件模板和JSX可以使用keba…

sklearn之神经网络学习算法

文章目录 什么是神经网络人工神经网络的结构输入层输出层隐含层神经元的链接 近几年深度学习还是比较火的&#xff0c;尤其是在大语言模型之后&#xff0c;在本质上深度学习网络就是层数比较多的神经网络。sklearn并不支持深度学习&#xff0c;但是支持多层感知机&#xff08;浅…

AI 歌词创作:突破想象,惊艳听觉

在音乐的世界里&#xff0c;歌词是触动心灵的钥匙&#xff0c;是引发共鸣的桥梁。而如今&#xff0c;AI 歌词创作正以其惊人的力量&#xff0c;突破我们的想象&#xff0c;为我们带来前所未有的听觉盛宴。 “妙笔生词智能写歌词软件&#xff08;veve522&#xff09;”便是这场…

【机器学习-00】机器学习是什么?

在科技飞速发展的今天&#xff0c;机器学习已成为一个热门话题&#xff0c;广泛应用于各个行业和领域。那么&#xff0c;机器学习到底是什么&#xff1f;它又是如何工作的&#xff1f;本文将深入探讨机器学习的定义、原理及其在各领域的应用&#xff0c;带领读者走进这个神秘而…

QuantML-Qlib Model | ICLR 24: 基于独立Patch的时序预测模型

QuantML-Qlib Model | ICLR 24: 基于独立Patch的时序预测模型 原创 QuantML QuantML 2024年07月12日 19:23 上海 Content 论文提出了一种新的时间序列嵌入方法&#xff0c;主要观点是独立地嵌入时间序列块&#xff08;patches&#xff09;&#xff0c;而不是捕捉这些块之间的…

MySQl高级篇-主从复制

主从复制 复制的基本原理 slave会从master读取binlog来进行数据同步 MySQL复制过程分成三步&#xff1a; master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件&#xff0c;binary log events;slave将master的binary log events拷贝到它的中继日志(r…

SpringBoot+Vue实现简单的文件上传(txt篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传txt文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el-…

2024-07-13 Unity AI状态机2 —— 项目介绍

文章目录 1 项目介绍2 模块介绍2.1 BaseState2.2 ...State2.2.1 PatrolState2.2.2 ChaseState / AttackState / BackState 2.3 StateMachine2.4 Monster 3 其他功能4 类图 项目借鉴 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 项目介绍 ​ 本项目使用 Unity 2…