项目三层架构详情

三层架构

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(正向)代理 vs. 反向代理

&#xff08;正向&#xff09;代理 vs. 反向代理 代理和反向代理都是针对用户而言的。 一、&#xff08;正向&#xff09;代理——代理客户端 1. 流程 代理会隐藏客户端的真实信息&#xff08;IP、端口&#xff09;&#xff0c;代替客户端在互联网上发起请求&#xff0c;并将…

09:C语言进阶篇一

C语言进阶篇一 数据类型1.1、内存占用与sizeof运算符1.2、有符号数和无符号数1.3、整形数和浮点型数存储方式1.4、数据类型转换1.4.1、隐式转换1.4.2、强制转换 数据类型 基本数据类型&#xff1a;char&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&…

什么是RLHF(基于人类反馈的强化学习)?

什么是RLHF&#xff08;基于人类反馈的强化学习&#xff09;&#xff1f; 基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是一种结合强化学习和人类反馈的技术&#xff0c;用于训练智能体&#xff0c;使其行为更符合人类期…

哪些类型的工作需要六西格玛绿带培训?

一、六西格玛绿带是什么&#xff1f; 首先&#xff0c;让我们来了解一下六西格玛绿带。六西格玛绿带是六西格玛管理体系中的一个重要角色&#xff0c;他们通常负责在项目中执行六西格玛方法和工具&#xff0c;协助黑带完成复杂的项目任务。绿带需要掌握基本的六西格玛知识和技…

OpenJudge | 最高的分数

目录 描述输入输出样例输入样例输出思路方法一方法二 CodeCC 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师讲授的《计算概论》这门课期中考试刚刚结束&#xff0c;他想知道考试中取得的最高分数。因为人数比较多&#xff0c;他觉得这件事情交给计算机来做比较方便。你能…

萝卜快跑:未来出行的双刃剑

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 在这个日新月异的科技时代&#xff0c;无人驾驶技术正以前所未有的速度改变着我们的出行方式。萝卜快跑&#xff0c;作为自动驾驶出租车领域的佼佼者&#xff0c;其出现无疑为城市交通注入了新的活力&#xff…

如何在在system_real_robot.launch修改订阅的雷达

在 system_real_robot.launch 文件中修改订阅的雷达,以使用开源 SLAM 包(如 FastLIO 和 TARE)输出的优化后雷达话题。可以让你的系统使用这些 SLAM 包提供的高精度雷达数据。 假设你的 Launch 文件中包括这一行: xml <param name="registeredScanTopic" ty…

Kylin系列(六)查询优化:提升 Kylin 查询性能

目录 1. Kylin查询优化的基础知识 1.1 Kylin的架构概述 1.2 Cube的构建与存储 2. 索引设计与优化 2.1 选择适当的维度和度量 2.2 使用层级维度 2.3 使用字典编码 3. 查询改写与优化 3.1 选择合适的查询语法 3.2 避免不必要的计算 3.3 使用过滤条件 4. Cube设计优化…

政企单位光纤资源高效管理与优化策略

引言 随着信息技术的飞速发展&#xff0c;政企单位对于通信基础设施的管理要求日益提高。然而&#xff0c;传统的管理模式&#xff0c;如Excel表格记录和纸质审批流程&#xff0c;已难以满足当前复杂多变的业务需求。在此背景下&#xff0c;我们实施了光纤管理的数字化转型项目…

双栈实现一个队列

两个栈可实现将列表倒序&#xff1a;设有含三个元素的栈 A [1,2,3] 和空栈 B [] 。若循环执行 A 元素出栈并添加入栈 B &#xff0c;直到栈 A 为空&#xff0c;则 A [] , B [3,2,1] &#xff0c;即栈 B 元素为栈 A 元素倒序。 利用栈 B 删除队首元素&#xff1a;倒序后&am…

自定义异步线程服务

异步线程池配置&#xff1a; /*** 启动异步线程-并配置线程池*/ Configuration EnableAsync public class AsyncConfig {Bean(name "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setC…

玩转springboot之SpringBoot单元测试

SpringBoot单元测试 spring单元测试 之前在spring项目中使用单元测试时是使用注解RunWith(SpringJUnit4ClassRunner.class)来进行的 RunWith(SpringJUnit4ClassRunner.class)// 通过自动织入从应用程序上下文向测试本身注入beanWebAppConfiguration // 指定web环境ContextConfi…

电商出海第一步,云手机或成重要因素

电商出海第一步并非易事&#xff0c;挑战和机遇并存&#xff0c;出海企业或个人或将借助云手机从而达成商业部署全球化的目的&#xff1b; 下面我们从网络稳定、数据安全、成本、以及多平台适配方面来看&#xff0c;究竟为什么说云手机会成为出海的重要因素&#xff1b; 首先…

新手前端系列入门-什么是前端开发

一、什么是前端 前端&#xff0c;也称为前端开发或客户端开发&#xff0c;一般是指在构建网站或Web应用程序时&#xff0c;与用户直接交互的部分。就是指那些我们在网页上能看到、能直接跟用户打交道的部分。 简单来说&#xff0c;就是你打开一个网站&#xff0c;能看到的所有…

西门子大手笔又买一家公司,2024年“两买”和“两卖”的背后……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 今年&#xff0c;这家全球工业巨头不仅精准出击&#xff0c…

第4章 引擎提供的着色器工具函数和数据结构

4.1 UnityShaderVariables.cginc文件中的着色器常量和函数 4.1.1 进行变换操作用的矩阵 1.判断USING DIRECTIONAL LIGTH宏是否定义并分析与立体渲染相关的宏 立体多例化渲染技术的核心思想是一次向渲染管道上提交两份待渲染的几何体数据&#xff0c;减少绘制调用&#xff08;d…

【信创国产化】Nacos 2.3.2连接达梦数据库

JeecgBoot 目前提供的nacos版本号 2.3.2已经支持与达梦数据库对接。 jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos项目默认加入了达梦驱动和yml配置。如果你是老代码&#xff0c;可以参考下面的步骤手工集成 项目地址&#xff1a;https://github.com/jeecgboot/JeecgBoot…

Anaconda 安装与基本使用总结

最近需要在服务器上安装和使用aconada&#xff0c;发现之前总是在网上找教程&#xff0c;每次都要找&#xff0c;很麻烦。这次就自己写一个安装笔记。以备日后使用。 1.服务器系统版本 ubuntu22.04 2. 软件安装 aconda软件的安装可以下面的教程&#xff08;实测有效&#xf…

斐波那契查找算法

斐波那契查找原理&#xff0c;仅仅改变了中间结点(mid)的位置&#xff0c;mid不再是中间或插值得到,而是位于黄金分割点附近&#xff0c;即midlowF(k-1)-1(F代表斐波那契数列) F[k]F[k-1]F[k-2],>(F[k]-1) (F[k-1]-1)(F[k-2]-1)1 说明:只要顺序表的长度为F[k]-1,则可以将该…

arm64架构kvm情景分析 - type1型和type2型虚拟机管理器

内核版本&#xff1a;linux-v5.9 架构&#xff1a;arm64 1 type1型和type2虚拟机管理器 在arm64架构中&#xff0c;共有EL3到EL0四个异常级别&#xff0c;EL3异常级别最高。通常操作系统&#xff08;如linux&#xff09;运行在EL1&#xff0c;应用程序运行在EL0&#xff0c;EL…