項目三層架構詳情

三層架構

三層架構就是為了符合“高內聚,低耦合”思想,把各個功能模塊劃分為表示層(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.pswp.cn/web/43650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43650.shtml
英文地址,請注明出處:http://en.pswp.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…