日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

在winform中使用三层架构学习总结

發(fā)布時(shí)間:2025/4/14 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在winform中使用三层架构学习总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Winform 三層架構(gòu)小例子

http://www.cnblogs.com/jacky73/archive/2009/09/01/1558083.html
在web開發(fā)中常常用到工廠模式三層架構(gòu),現(xiàn)在也在Winform中應(yīng)用這種架構(gòu)方式,嘗試了很多,也模仿了經(jīng)典例子PetShop,但是還是不行,也參考了網(wǎng)上的一些例子。現(xiàn)在把我這個(gè)例子的整個(gè)制作過程簡單的介紹一下。(由于本例子是介紹三層結(jié)構(gòu),所以只是簡單的應(yīng)用,如果你覺得這種方式好,請(qǐng)自己實(shí)現(xiàn)其他模塊)
結(jié)構(gòu):
-------PMIS--------主程序代碼
表示層,負(fù)責(zé)應(yīng)用程序的表現(xiàn)形式、用戶體驗(yàn)等。
-------DALFactory-----抽象工廠
抽象工廠,用于創(chuàng)建各種數(shù)據(jù)對(duì)象的方法,這里有配置文件和反射的運(yùn)用。
-------IDAL--------數(shù)據(jù)接口層(控制是選擇什么類型的數(shù)據(jù)庫)
數(shù)據(jù)操作接口,數(shù)據(jù)訪問層實(shí)現(xiàn)其接口并重寫它(體現(xiàn)了面向接口的編程思想)。
-------BLL------
處理應(yīng)用程序的業(yè)務(wù)邏輯,被表示層調(diào)用。
-------Model-------構(gòu)造模型(對(duì)應(yīng)數(shù)據(jù)庫字段)
Model程序集,存放實(shí)體類,用于數(shù)據(jù)訪問層和邏輯層調(diào)用
-------SQLServerDAL----SQLServer數(shù)據(jù)訪問層
數(shù)據(jù)訪問層,實(shí)現(xiàn)具體的select、update、delete....操作,重寫IDAL接口。
-------DBUtility----公共數(shù)據(jù)訪問層
數(shù)據(jù)處理層,實(shí)現(xiàn)具體的ExecuteReader,ExecuteDataTable,ExecuteNonQuery等。
-------Utility----公共層
實(shí)現(xiàn)從配置文件中讀取數(shù)據(jù)庫聯(lián)接字符串。
1、數(shù)據(jù)庫結(jié)構(gòu)
數(shù)據(jù)庫名PMIS
表Admin
? ? [ID] [bigint] 編號(hào)
? ? [Name] [varchar](10) 名稱
? ? [PassWord] [varchar](100) 密碼
? ? 略......
建表語句
CREATE TABLE [dbo].[Admin](
? ? [ID] [bigint] IDENTITY(1,1) NOT NULL,
? ? [Name] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
? ? [PassWord] [varchar](100) COLLATE Chinese_PRC_CI_AS NOT NULL,
? ? [PurviewID] [int] NOT NULL,
? ? [Remember] [int] NULL,
? ? [AutoRun] [int] NULL,
? ? [DepartmentsID] [bigint] NULL,
?CONSTRAINT [PK_管理員_1] PRIMARY KEY CLUSTERED?
(
? ? [ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
2、接著建立數(shù)據(jù)庫模型
Model
?#region 內(nèi)部成員字段
? ? ? ? private int _id;
? ? ? ? private string _Name;
? ? ? ? private string _Password;
? ? ? ? 略...
#endregion
#region 方法
? ? ? ? public AdminInfo() { }


? ? ? ? public AdminInfo(string userName, string password)
? ? ? ? {
? ? ? ? ? ? this._Name = userName;
? ? ? ? ? ? this._Password = password;
? ? ? ? }
#endregion
3、建立DALFactory-----抽象工廠
public static IDAL.IAdmin Create()
? ? ? ? {
? ? ? ? ? ? string path=System.Configuration.ConfigurationSettings.AppSettings["DAL"];
? ? ? ? ? ? string className="SQLServerDAL.Admin";


? ? ? ? ? ? IDAL.IAdmin acount=(IDAL.IAdmin)Assembly.Load(path).CreateInstance(className);
? ? ? ? ? ? return acount;
? ? ? ? }
4、建立IDAL--------數(shù)據(jù)接口層
public interface IAdmin
? ? {
? ? ? ? AdminInfo Login(string userName, string password);
? ? ? ? int Insert(AdminInfo account);
? ? ? ? int Update(AdminInfo account);
? ? }
5、建立Utility----公共層
public static string ConnectionString()
? ? ? ? {
? ? ? ? ? ? return (ConfigurationSettings.AppSettings["ConnectionString"]);
? ? ? ? }
6、建立DBUtility----公共數(shù)據(jù)訪問層和SQLServer數(shù)據(jù)訪問層
DBUtility中建立SQLHelper類
SQLServerDAL的Admin類需要繼承IAdmin
public class Admin:IAdmin
? ? {}
Admin類主要實(shí)現(xiàn)用戶登陸功能
7、建立業(yè)務(wù)邏輯曾BLL
方法public static AdminInfo Login(string userName, string password){}
8、為PMIS主程序添加應(yīng)用程序配置文件app.config
添加<appSettings>
? ? <add key="ConnectionString" value="server=.;uid=sa;pwd=;database=PMIS"></add>
? ? <add key="DAL" value="SQLServerDAL"></add>
? </appSettings>
在主程序的窗體中添加控件,為按鈕添加事件
if (BLL.Admin.Login(參數(shù)) == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ?//處理...
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //處理...
? ? ? ? ? ? }
========

C# 使用三層架構(gòu)實(shí)例演示-winForm 窗體登錄功能

http://blog.csdn.net/qq649792393/article/details/41450193


什么是三層架構(gòu)?百度百科講的很詳細(xì),大家可以去搜索。這篇文章并不是討論這個(gè)問題。而是通過一個(gè)例子幫助大家理解三層。理論上的東西講的比較少。希望可以幫助到像我這樣的小白學(xué)習(xí)。希望可以幫助到大家!
個(gè)人覺得這個(gè)例子還是很基礎(chǔ)的,但是也可以幫助大家理解三層的設(shè)計(jì)理念。完成了這個(gè)小例子之后,你可以輕松的創(chuàng)建擁有相同功能的asp頁面,而不需要更改太多的代碼,因?yàn)榇a處理的邏輯與數(shù)據(jù)操作已經(jīng)實(shí)現(xiàn)了,只需更改網(wǎng)頁空間屬性及調(diào)用方法即可,同時(shí)幫助了解分層的便利性。至于三層的缺陷,大家可以在以后的開發(fā)中慢慢了解。
好了廢話不說了,下面我們就直接開始正文吧。


數(shù)據(jù)庫設(shè)計(jì)相當(dāng)簡單,就一個(gè)數(shù)據(jù)庫然后又張存著用戶名和密碼的表。
數(shù)據(jù)庫設(shè)計(jì):
數(shù)據(jù)庫名稱:threeLayer ? ?
表: users ? ??
列:1.username 賬號(hào) ? 2.password ?密碼
數(shù)據(jù)庫創(chuàng)建表的腳本如下:
[sql] view plain copy
CREATE TABLE [dbo].[users]( ?
? ? [id] [int] IDENTITY(1,1) NOT NULL, ?
? ? [username] [varchar](50) NULL, ?
? ? [password] [varchar](50) NULL, ?
?CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED ??
( ?
? ? [id] ASC ?
)WITH (PAD_INDEX ?= OFF, STATISTICS_NORECOMPUTE ?= OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS ?= ON, ALLOW_PAGE_LOCKS ?= ON) ON [PRIMARY] ?
) ON [PRIMARY] ?
GO ?
SET ANSI_PADDING OFF ?
GO ?
SET IDENTITY_INSERT [dbo].[users] ON ?
INSERT [dbo].[users] ([id], [username], [password]) VALUES (1, N'admin', N'admin') ?
INSERT [dbo].[users] ([id], [username], [password]) VALUES (2, N'user1', N'user1') ?
INSERT [dbo].[users] ([id], [username], [password]) VALUES (3, N'user2', N'user2') ?
INSERT [dbo].[users] ([id], [username], [password]) VALUES (4, N'user3', N'user3') ?
SET IDENTITY_INSERT [dbo].[users] OFF ?


三層數(shù)據(jù)傳遞整體思路:
用戶輸入賬號(hào)密碼->點(diǎn)擊登錄->進(jìn)入BLL層進(jìn)行輸入與數(shù)據(jù)的邏輯處理->進(jìn)入DAL層將BAL層的邏輯進(jìn)行實(shí)現(xiàn)(用戶輸入的賬號(hào)的密碼與數(shù)據(jù)庫匹配),返回結(jié)果
其中數(shù)據(jù)的傳遞用model實(shí)體類屬性來傳遞
步驟:
新建一個(gè)windows 窗體應(yīng)用程序項(xiàng)目并命名為threeLayerText,路徑自己選吧,可以選擇回收站


在自動(dòng)新建的窗體項(xiàng)目中,雙擊Form1.cs,打開窗體設(shè)計(jì)。


在窗體中添加兩個(gè)label,兩個(gè)TextBox分別命名為textBoxAccount、textBoxtextBoxPsw和一個(gè)button 命名
為 butLogin。這里命名指的是控件name屬性


為窗體添加一個(gè)應(yīng)用配置文件:右鍵窗體項(xiàng)目文件-添加-新建項(xiàng)-應(yīng)用程序配置文件


在配置文件<configuration>節(jié)點(diǎn)中添加數(shù)據(jù)庫連接語句
根據(jù)數(shù)據(jù)庫配置Initial Catalog 為數(shù)據(jù)庫名稱,User ID 為登錄數(shù)據(jù)庫賬戶,Password 為改賬號(hào)密碼
添加后app.config完整內(nèi)容如下
[html] view plain copy
<?xml version="1.0" encoding="utf-8" ?> ?
<configuration> ?
? <connectionStrings> ?
? ? <add name="dbConnection" connectionString="Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123" ?
? ? ? ? ? providerName="SQLClient" /> ?
? </connectionStrings> ?
</configuration> ?


添加類庫:右鍵項(xiàng)目解決方案-添加-新建項(xiàng)目-類庫,命名,確定
分別添加DAL、BAL、Model三個(gè)類庫


在Model類庫中添加userInfo類,用于在各個(gè)層之間傳遞數(shù)據(jù)
在類庫中新建一個(gè)用戶類 userInfo:右鍵Model類庫-添加-類(或者選中model類庫,使用shift+alt+c快捷鍵)
在userInfo類中添加屬性
[csharp] view plain copy
private string _username; ?
private string _psw; ?
??
public string username ?
{ ?
? ? ? set { _username = value; } ?
? ? ? get { return _username; } ?
} ?
public string psw ?
{ ?
? ? ? set { _psw = value; } ?
? ? ? get { return _psw; } ?
} ?
Model類完整代碼如下:
[csharp] view plain copy
using System; ?
using System.Collections.Generic; ?
using System.Linq; ?
using System.Text; ?
??
namespace Model ?
{ ?
? ? public class userInfo ?
? ? { ?
? ? ? ? private string _username; ?
? ? ? ? private string _psw; ?
??
? ? ? ? public string username ?
? ? ? ? { ?
? ? ? ? ? ? set { _username = value; } ?
? ? ? ? ? ? get { return _username; } ?
? ? ? ? } ?
? ? ? ? public string psw ?
? ? ? ? { ?
? ? ? ? ? ? set { _psw = value; } ?
? ? ? ? ? ? get { return _psw; } ?
? ? ? ? } ?
? ? } ?
} ?


在DAL層中添加數(shù)據(jù)連接、查詢操作類和方法
添加system.configuration引用,使類可以讀取配置文件節(jié)點(diǎn),讀取配置文件中連接數(shù)據(jù)庫語句;右鍵引用-添加引用-選擇程序集-勾選-確定




添加 DBbase類(右鍵DAL項(xiàng)目-添加-新建項(xiàng)-命名好-確定) 用于連接數(shù)據(jù)庫,添加System.Data 和 System.Data.SqlClient 命名空間,別問我用來干嗎,其實(shí)我也不知道用來干嗎的。
創(chuàng)建一個(gè)基本的查詢方法用于查詢并返回記錄條數(shù)。DBbase類完整代碼如下:
[csharp] view plain copy
using System; ?
using System.Collections.Generic; ?
using System.Linq; ?
using System.Text; ?
using System.Data; ?
using System.Data.SqlClient; ?
??
namespace DAL ?
{ ?
? ? public class DBbase ?
? ? { ?
? ? ? ? //讀取配置文件 連接數(shù)據(jù)庫語句 ?
? ? ? ? public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString; ?
? ? ? ? //public static string strCon = "Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123"; ?
? ? ? ? ??
? ? ? ? //實(shí)例化連接對(duì)象 con ?
? ? ? ? SqlConnection con = new SqlConnection(strCon); ?
??
? ? ? ? //檢測(cè)連接是否打開 ?
? ? ? ? public void chkConnection() ?
? ? ? ? { ?
? ? ? ? ? ? if (this.con.State == ConnectionState.Closed) ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? this.con.Open(); ?
? ? ? ? ? ? } ?
? ? ? ? } ?
??
? ? ? ? //執(zhí)行語句,返回該語句查詢的數(shù)據(jù)行的總數(shù) ?
? ? ? ? public int returnRowCount(string strSQL) ?
? ? ? ? { ?
? ? ? ? ? ? chkConnection(); ?
? ? ? ? ? ? try ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? SqlDataAdapter da = new SqlDataAdapter(strSQL, con); ?
? ? ? ? ? ? ? ? DataSet ds = new DataSet(); ?
? ? ? ? ? ? ? ? da.Fill(ds); ?
? ? ? ? ? ? ? ? return ds.Tables[0].Rows.Count; ?
? ? ? ? ? ? } ?
? ? ? ? ? ? catch ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? return 0; ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? } ?
} ?
添加 userAccess類(右鍵DAL項(xiàng)目-添加-新建項(xiàng)-命名好-確定) 用執(zhí)行查詢語句查找用戶輸入賬號(hào)密碼在數(shù)據(jù)庫中存在記錄條數(shù)
userAccess類完整代碼如下:
[csharp] view plain copy
using System; ?
using System.Collections.Generic; ?
using System.Linq; ?
using System.Text; ?
??
namespace DAL ?
{ ?
? ? public class userAccess ?
? ? { ?
? ? ? ? //實(shí)例化DBbase 對(duì)象 ?
? ? ? ? DBbase db = new DBbase(); ?
??
? ? ? ? //用戶登錄的方法 ?
? ? ? ? public int userLogin(string name, string psw) ?
? ? ? ? { ?
? ? ? ? ? ? string strsql = "select * from users where username = '" + name + "' and password = '" + psw + "'"; ?
? ? ? ? ? ? return db.returnRowCount(strsql); ?
? ? ? ? } ?
? ? } ?
} ?


在BLL層中添加用戶輸入數(shù)據(jù)與數(shù)據(jù)庫匹配的邏輯代碼
添加Model、DAL類庫引用:右鍵BLL類庫中引用文件夾,右鍵-添加引用-選擇解決方案-項(xiàng)目-選中Model、DAL-確定
實(shí)例化DAL.userAccess 類,并新建一個(gè)方法調(diào)用DAL.userAccess方法,參數(shù)為Model實(shí)體類中的useInfo類,完整代碼如下:
[csharp] view plain copy
using System; ?
using System.Collections.Generic; ?
using System.Linq; ?
using System.Text; ??
??
namespace BLL ?
{ ?
? ? public class userAccess ?
? ? { ?
? ? ? ? DAL.userAccess d_userAccess = new DAL.userAccess(); ?
? ? ? ? public int userLogin(Model.userInfo m_userInfo) ?
? ? ? ? { ?
? ? ? ? ? ? return d_userAccess.userLogin(m_userInfo.username, m_userInfo.psw); ?
? ? ? ? } ?
? ? } ?
} ?
回到窗體設(shè)計(jì)中,添加用戶輸入處理與調(diào)用BLL層方法
添加Model、DAL類庫引用:右鍵threeLayerText項(xiàng)目中引用文件夾,右鍵-添加引用-選擇解決方案-項(xiàng)目-選中Model、BLL-確定


打開窗體后臺(tái)代碼,實(shí)例化Model.userInfo 、BLL.userAccess。代碼如下
[csharp] view plain copy
//實(shí)例化model層中 userInfo類用于傳遞數(shù)據(jù) ?
Model.userInfo m_userInfo = new Model.userInfo(); ?
??
//實(shí)例化BLL層中 userAccess方法銜接用戶輸入與數(shù)據(jù)庫匹配 ?
BLL.userAccess b_userAccess = new BLL.userAccess(); ?


雙擊登錄按鈕,添加點(diǎn)擊事件。代碼如下
[csharp] view plain copy
//將用戶輸入的賬號(hào)密碼 賦值給userInfo類 username、psw屬性 ?
m_userInfo.username = textBoxAccount.Text.Trim().ToString(); ?
m_userInfo.psw = textBoxPsw.Text.Trim().ToString(); ?
??
//如果BLL層中 useLogin調(diào)用返回記錄條數(shù) 大于1 則賬號(hào)密碼正確 ?
if (b_userAccess.userLogin(m_userInfo) > 0) ?
{ ?
? ?MessageBox.Show("登錄成功"); ?
} ?
else ?
{ ?
? ?MessageBox.Show("登錄失敗"); ?
?} ?
完整Form1.cs 代碼如下
[csharp] view plain copy
using System; ?
using System.Collections.Generic; ?
using System.ComponentModel; ?
using System.Data; ?
using System.Drawing; ?
using System.Linq; ?
using System.Text; ?
using System.Windows.Forms; ?
??
namespace threeLayerText ?
{ ?
? ? public partial class Form1 : Form ?
? ? { ?
? ? ? ? //實(shí)例化model層中 userInfo類用于傳遞數(shù)據(jù) ?
? ? ? ? Model.userInfo m_userInfo = new Model.userInfo(); ?
??
? ? ? ? //實(shí)例化BLL層中 userAccess方法銜接用戶輸入與數(shù)據(jù)庫匹配 ?
? ? ? ? BLL.userAccess b_userAccess = new BLL.userAccess(); ?
??
? ? ? ? public Form1() ?
? ? ? ? { ?
? ? ? ? ? ? InitializeComponent(); ?
? ? ? ? } ?
??
? ? ? ? private void Form1_Load(object sender, EventArgs e) ?
? ? ? ? { ?
??
? ? ? ? } ?
??
? ? ? ? //登錄按鈕 事件 ?
? ? ? ? private void butLogin_Click(object sender, EventArgs e) ?
? ? ? ? { ?
? ? ? ? ? ? //將用戶輸入的賬號(hào)密碼 賦值給userInfo類 username、psw屬性 ?
? ? ? ? ? ? m_userInfo.username = textBoxAccount.Text.Trim().ToString(); ?
? ? ? ? ? ? m_userInfo.psw = textBoxPsw.Text.Trim().ToString(); ?
??
? ? ? ? ? ? //如果BLL層中 useLogin調(diào)用返回記錄條數(shù) 大于1 則賬號(hào)密碼正確 ?
? ? ? ? ? ? if (b_userAccess.userLogin(m_userInfo) > 0) ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? MessageBox.Show("登錄成功"); ?
? ? ? ? ? ? } ?
? ? ? ? ? ? else ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? MessageBox.Show("登錄失敗"); ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? } ?
} ?


保存,可以調(diào)試了。


關(guān)于Model實(shí)體層的描述:
Model又叫實(shí)體類,這個(gè)東西,大家可能覺得不好分層。我是這樣理解的:UI<-->Model<-->BLL<-->Model<-->DAL,如此則認(rèn)為Model在各層之間起到了一個(gè)數(shù)據(jù)傳輸?shù)臉蛄鹤饔谩2贿^在這里,我們不是把事情想簡單,而是想復(fù)雜了。
摘自:http://www.cnblogs.com/sdjxcolin/archive/2008/12/12/1353780.html 這篇文章講解了這個(gè)問題
========

C#中三層架構(gòu)UI、BLL、DAL、Model實(shí)際操作

http://blog.csdn.net/zhgl7688/article/details/43669463


三層架構(gòu)分為:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)再加上實(shí)體類庫(Model)


1、實(shí)體類庫(Model),主要存放數(shù)據(jù)庫中的表字段。


操作:


?(1)先建立實(shí)體類庫Model,打開項(xiàng)目,在解決方案中右鍵--》添加--》新建項(xiàng)目--》選中類庫--》改名Model--》確定


(2)選中Model類庫--》Shift+ALT+C--》建立實(shí)體類。UserInfo類


[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片
namespace Model ?
{ ?
? ?public ?class UserInfo ?
? ? { ?
? ? ? ? public string ?UserName { get; set; } ?
? ? ? ? public string ?Password { get; set; } ?
? ? } ?
} ?




2、數(shù)據(jù)訪問層(DAL),主要是存放對(duì)數(shù)據(jù)類的訪問,即對(duì)數(shù)據(jù)庫的添加、刪除、修改、更新等基本操作
操作:


(1)先建立數(shù)據(jù)訪問層類庫DAL,打開項(xiàng)目,在解決方案中右鍵--》添加--》新建項(xiàng)目--》選中類庫--》改名DAL--》確定


(2)在DAL中添加對(duì)Model的引用,選中DAL--》Alt+P+R--》解決方案--》項(xiàng)目--》選中MOdel--》確定


(3)在DAL中添加對(duì)system.configuration的引用,選中DAL--》Alt+P+R--》程序集--》框架--》選中System.configuration--》確定


(4)建立數(shù)據(jù)訪問類,選中DAL--》Shift+ALT+C--》建立數(shù)據(jù)訪問類。UserDB類


[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片
using System.Configuration; ?
using Model; ?
using System.Data; ?
using System.Data.SqlClient; ?
??
namespace DAL ?
{ ?
? ? class UserDB ?
? ? { ?
? ? ? ? private string connString = ConfigurationManager.ConnectionStrings["connString"].ToString(); ?
? ? ? ? public int AddUser(UserInfo userInfo) ?
? ? ? ? { ?
? ? ? ? ? ? //對(duì)數(shù)據(jù)庫進(jìn)添加一個(gè)用戶操作 ?
? ? ? ? ? ? string commandText = "insert into UserInfo (userName,Password)values(@userName,@Password)"; ?
? ? ? ? ? ? SqlParameter[] paras = new SqlParameter[] ?
? ? ? ? ? ? { ??
? ? ? ? ? ?new SqlParameter ("@userName",userInfo.UserName ), ?
? ? ? ? ? ?new SqlParameter ("@Password",userInfo.Password ) ?
? ? ? ? ? ? }; ?
? ? ? ? ? ? return SqlHelper.ExecuteNonQuery(connString, CommandType.Text, commandText, paras); ?
? ? ? ? } ?
? ? } ?
[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片
//添加其他對(duì)數(shù)據(jù)庫操作 ?
} ?
3、業(yè)務(wù)邏輯層(BLL)對(duì)傳送數(shù)據(jù)進(jìn)行邏輯判斷分折,并進(jìn)行傳送正確的值。
(1)先建立業(yè)務(wù)邏輯層類庫BLL,打開項(xiàng)目,在解決方案中右鍵--》添加--》新建項(xiàng)目--》選中類庫--》改名BLL--》確定


(2)在BLL中添加對(duì)Model、DAL的引用,選中BLL--》Alt+P+R--》解決方案--》項(xiàng)目--》選中MOdel、DAL--》確定


(3)建立業(yè)務(wù)邏輯類,選中BLL--》Shift+ALT+C--》建立業(yè)務(wù)邏輯類。LoginManager類
[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片
using DAL; ?
using Model; ?
??
namespace BLL ?
{ ?
? ? public class LoginManager ?
? ? { ?
? ? ? ? private UserDB userDB = new UserDB(); ?
? ? ? ? public bool Add(UserInfo userInfo, out string messageStr) ?
? ? ? ? { ?
? ? ? ? ? ? messageStr = "";//返回界面層添加用戶返回信息 ?
? ? ? ? ? ? bool isSuccess = false; ?
? ? ? ? ? ? if (userInfo.UserName.Trim().Length != 0)//判斷從傳遞來的username是否為空 ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? if (userDB.IsEquals(userInfo))//傳給DALl操作判斷數(shù)據(jù)庫中是否有重復(fù)值 ?
? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? userDB.AddUser(userInfo);//傳給DAL操作增加一個(gè)新用戶 ?
? ? ? ? ? ? ? ? ? ? isSuccess = true; ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? messageStr = "有相同的值"; ?
? ? ? ? ? ? } ?
? ? ? ? ? ? else ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? messageStr = "不能為空"; ?
??
? ? ? ? ? ? } ?
? ? ? ? ? ? return isSuccess;//返回界面層是否添加成功 ?
? ? ? ? } ?
? ? } ?
} ?


5、表現(xiàn)層(UI)即用戶界面層
(1)在UI中添加對(duì)Model、BLL的引用,選中UI--》Alt+P+R--》解決方案--》項(xiàng)目--》選中MOdel、BLL--》確定


(2)編寫代碼傳遞數(shù)據(jù)給BLL層。


[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片
? ? UserInfo userInfo; ?
? ? LoginManager lm = new LoginManager(); ?
? ? private void btnAdd_Click(object sender, EventArgs e) ?
? ? { ?
? ? ? ? userInfo = new UserInfo() ?
? ? ? ? { ?
? ? ? ? ? ? UserName = txtUserName.Text.Trim(), ?
? ? ? ? ? ? Password = txtPassword.Text.Trim() ?
? ? ? ? }; ?
? ? ? ? string messageStr = ""; ?
??
? ? ? ? if (lm.Add(userInfo, out ?messageStr)) ?
? ? ? ? { ?
? ? ? ? ? ? MessageBox.Show("添加成功"); ?
? ? ? ? } ?
? ? ? ? else ?
? ? ? ? { ?
? ? ? ? ? ? MessageBox.Show(messageStr); ?
? ? ? ? ? ? txtUserName.Focus(); ?
? ? ? ? } ?
??
? ? } ?
} ?
========

用三層架構(gòu)來做winform程序

http://blog.csdn.net/clb929/article/details/54295211


? 三層架構(gòu)是一種代碼分層思想,簡單的說就是將一個(gè)項(xiàng)目分為界面展示、業(yè)務(wù)邏輯、數(shù)據(jù)訪問三層,各層之間保持一定的獨(dú)立性,降低代碼之間的耦合性,這樣做的好處是顯而易見的:
1、各層之間的改動(dòng)不會(huì)影響到其他層(比較大的變動(dòng)除外,如果客戶要求業(yè)務(wù)流程、數(shù)據(jù)庫結(jié)構(gòu)都變了,你還期望有什么不會(huì)變呢)


2、基本不用寫SQL語句了,自動(dòng)生成的代碼是參數(shù)化查詢,可以防止SQL注入


3、代碼條理清楚,便于理解
? 當(dāng)然三層架構(gòu)不是拯救一切的靈丹妙藥,比如:
1、比較小的項(xiàng)目何必糾結(jié)用什么架構(gòu)呢,在你琢磨架構(gòu)的時(shí)候,用winform可能已經(jīng)寫完了
2、速度會(huì)有所降低,相對(duì)于直接訪問數(shù)據(jù)庫,三層架構(gòu)增加了中間層,速度降低是肯定的


? 說到三層架構(gòu),可能第一時(shí)間想到的就是mvc,然而三層架構(gòu)并不是web的專利,歸根結(jié)底,三層架構(gòu)只是一種代碼分層思想,winform當(dāng)然也可以用,只不過界面展示這塊,mvc是網(wǎng)頁的形式,winform是windows窗體,其他兩層思路是一樣的。
? 下面就以一個(gè)非常簡單常見的商鋪展示程序來實(shí)際講解winform中如何實(shí)現(xiàn)三層架構(gòu)。
一、前期準(zhǔn)備
1、動(dòng)軟代碼生成器,國產(chǎn)神器,你值得擁有,全自動(dòng)生成數(shù)據(jù)訪問層代碼,百度就能找到,最后一版是2.78,作者沒有繼續(xù)更新了。已經(jīng)免費(fèi)開源,喜歡研究源代碼的可以繼續(xù)擴(kuò)展。


李天平的博客


http://blog.csdn.net/litp
http://www.cnblogs.com/ltp/category/44293.html
2、SQLiteStudio,選擇SQLite數(shù)據(jù)庫是因?yàn)檩p巧、無需安裝,對(duì)于這個(gè)示例程序足夠用了 ?,SQLiteStudio是免費(fèi)好用的SQLite數(shù)據(jù)庫圖形化管理工具,百度可得綠色版。
二、開發(fā)過程
1、下載動(dòng)軟代碼生成器,安裝完成之后運(yùn)行,連接到附件示例程序的SQLite數(shù)據(jù)庫,打開連接,右鍵點(diǎn)擊數(shù)據(jù)庫,選擇“新建.net項(xiàng)目”,選擇“簡單三層結(jié)構(gòu)”,下一步,選擇“Shops”、“Users”兩個(gè)表,點(diǎn)擊“開始生成”。


2、來到生成目錄,打開源代碼,可以看到5個(gè)項(xiàng)目,下面分別說說他們的作用


BLL--業(yè)務(wù)邏輯層,所有的業(yè)務(wù)邏輯全部寫在這里,動(dòng)軟已經(jīng)為每個(gè)表自動(dòng)生成了一個(gè)業(yè)務(wù)類,類名就是表名,BasicMethod區(qū)段是自動(dòng)生成的一些基礎(chǔ)方法,比如增刪改查、分頁查詢這些,ExtensionMethod區(qū)段是空的,我們自己寫的業(yè)務(wù)代碼寫在這個(gè)區(qū)段。


DAL--數(shù)據(jù)訪問層,所有的數(shù)據(jù)庫訪問的基礎(chǔ)方法寫在這里,動(dòng)軟已經(jīng)為每個(gè)表自動(dòng)生成了一個(gè)數(shù)據(jù)訪問類,類名就是表名,BasicMethod區(qū)段是自動(dòng)生成的一些基礎(chǔ)方法,比如增刪改查、分頁查詢這些,ExtensionMethod區(qū)段是空的,如果我們覺得這些基礎(chǔ)的數(shù)據(jù)庫操作方法不夠用,可以在這個(gè)區(qū)段添加自己的數(shù)據(jù)庫操作方法,但是只有數(shù)據(jù)庫的操作方法應(yīng)該寫在DAL類庫。
DBUtility--數(shù)據(jù)庫訪問的基礎(chǔ)類庫,封裝了MySQL,Sql,OLE,SqlLite,Oracle等數(shù)據(jù)庫訪問的方法,與ADO.NET相關(guān)的connection,DataAdapter,Command等全部在這里,DAL是在DBUtility基礎(chǔ)上的進(jìn)一步封裝的,這個(gè)類庫基本不需要修改。
Model--數(shù)據(jù)庫表結(jié)構(gòu)的映射,每一個(gè)類名代表數(shù)據(jù)庫中的一個(gè)相同名字的表,類的每一個(gè)字段、屬性表示表中對(duì)應(yīng)的字段,數(shù)據(jù)庫的一條記錄就對(duì)應(yīng)類的一個(gè)對(duì)象,這個(gè)類庫基本不需要修改。


Web-- 一些基礎(chǔ)的網(wǎng)頁,因?yàn)槲覀兪亲鰓inform的,所以這個(gè)不需要了,但是先別急著刪,等下我們還要來拷連接字符串。
最后在解決方案文件夾下有一個(gè)Lib文件夾,是一些動(dòng)態(tài)鏈接庫,看看上述每個(gè)項(xiàng)目缺什么就引用什么。


3、新建一個(gè)winform項(xiàng)目,在項(xiàng)目的屬性里將目標(biāo)框架設(shè)置為".net framework 4"(不是".net framework 4 profile"),這樣就有一個(gè)app.config文件了,打開app.config,打開Web項(xiàng)目根目錄下的Web.config文件,將appSettings整個(gè)一節(jié)拷貝到app.config文件configuration節(jié)點(diǎn)內(nèi),將連接字符串修改為SqlLite的格式,刪除Web項(xiàng)目。


? 補(bǔ)充一點(diǎn),我們的程序是怎么得到連接字符串的呢?在DBUtility類庫里,有一個(gè)PubConstant類,里面有一個(gè)ConnectionString屬性,通過ConfigurationManager.AppSettings["ConnectionString"]讀取了app.config文件里保存的連接字符串。


? 接下來就是開始做界面,寫代碼了,winform相信大家都很熟悉了,具體過程我就不多說了,直接上源代碼。


? 示例程序源代碼:


http://pan.baidu.com/s/1jIRZkfO
總結(jié):


1、動(dòng)軟自帶的SQLite動(dòng)態(tài)鏈接庫比較老,用他原來的運(yùn)行不起來,我換成了新版的,在Lib文件夾下的SQLite.Interop.dll和System.Data.SQLite.DLL,System.Data.SQLite.DLL需要在項(xiàng)目中引用,SQLite.Interop.dll要手動(dòng)拷貝到生成目錄


2、如果代碼寫完后數(shù)據(jù)庫結(jié)構(gòu)發(fā)生了變化(比如增加了一個(gè)字段),我能想到的辦法就是重新用動(dòng)軟生成一次,將BLL,DAL,DBUtility,Model替換掉,所以最好這幾個(gè)項(xiàng)目中不要寫自己的代碼了,要擴(kuò)展的話重新建項(xiàng)目吧。為什么不推薦手動(dòng)改呢,因?yàn)榧幢闶窃黾右粋€(gè)字段,也可能涉及到幾個(gè)類的修改,改動(dòng)大就更不用說了,手動(dòng)改代碼的話很有可能漏掉,能用最簡單的辦法搞定的事就用最簡單的辦法。
========

總結(jié)

以上是生活随笔為你收集整理的在winform中使用三层架构学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。