在winform中使用三层架构学习总结
生活随笔
收集整理的這篇文章主要介紹了
在winform中使用三层架构学习总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Winform 三層架構小例子
http://www.cnblogs.com/jacky73/archive/2009/09/01/1558083.html在web開發中常常用到工廠模式三層架構,現在也在Winform中應用這種架構方式,嘗試了很多,也模仿了經典例子PetShop,但是還是不行,也參考了網上的一些例子。現在把我這個例子的整個制作過程簡單的介紹一下。(由于本例子是介紹三層結構,所以只是簡單的應用,如果你覺得這種方式好,請自己實現其他模塊)
結構:
-------PMIS--------主程序代碼
表示層,負責應用程序的表現形式、用戶體驗等。
-------DALFactory-----抽象工廠
抽象工廠,用于創建各種數據對象的方法,這里有配置文件和反射的運用。
-------IDAL--------數據接口層(控制是選擇什么類型的數據庫)
數據操作接口,數據訪問層實現其接口并重寫它(體現了面向接口的編程思想)。
-------BLL------
處理應用程序的業務邏輯,被表示層調用。
-------Model-------構造模型(對應數據庫字段)
Model程序集,存放實體類,用于數據訪問層和邏輯層調用
-------SQLServerDAL----SQLServer數據訪問層
數據訪問層,實現具體的select、update、delete....操作,重寫IDAL接口。
-------DBUtility----公共數據訪問層
數據處理層,實現具體的ExecuteReader,ExecuteDataTable,ExecuteNonQuery等。
-------Utility----公共層
實現從配置文件中讀取數據庫聯接字符串。
1、數據庫結構
數據庫名PMIS
表Admin
? ? [ID] [bigint] 編號
? ? [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、接著建立數據庫模型
Model
?#region 內部成員字段
? ? ? ? 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--------數據接口層
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----公共數據訪問層和SQLServer數據訪問層
DBUtility中建立SQLHelper類
SQLServerDAL的Admin類需要繼承IAdmin
public class Admin:IAdmin
? ? {}
Admin類主要實現用戶登陸功能
7、建立業務邏輯曾BLL
方法public static AdminInfo Login(string userName, string password){}
8、為PMIS主程序添加應用程序配置文件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(參數) == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ?//處理...
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //處理...
? ? ? ? ? ? }
========
C# 使用三層架構實例演示-winForm 窗體登錄功能
http://blog.csdn.net/qq649792393/article/details/41450193什么是三層架構?百度百科講的很詳細,大家可以去搜索。這篇文章并不是討論這個問題。而是通過一個例子幫助大家理解三層。理論上的東西講的比較少。希望可以幫助到像我這樣的小白學習。希望可以幫助到大家!
個人覺得這個例子還是很基礎的,但是也可以幫助大家理解三層的設計理念。完成了這個小例子之后,你可以輕松的創建擁有相同功能的asp頁面,而不需要更改太多的代碼,因為代碼處理的邏輯與數據操作已經實現了,只需更改網頁空間屬性及調用方法即可,同時幫助了解分層的便利性。至于三層的缺陷,大家可以在以后的開發中慢慢了解。
好了廢話不說了,下面我們就直接開始正文吧。
數據庫設計相當簡單,就一個數據庫然后又張存著用戶名和密碼的表。
數據庫設計:
數據庫名稱:threeLayer ? ?
表: users ? ??
列:1.username 賬號 ? 2.password ?密碼
數據庫創建表的腳本如下:
[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 ?
三層數據傳遞整體思路:
用戶輸入賬號密碼->點擊登錄->進入BLL層進行輸入與數據的邏輯處理->進入DAL層將BAL層的邏輯進行實現(用戶輸入的賬號的密碼與數據庫匹配),返回結果
其中數據的傳遞用model實體類屬性來傳遞
步驟:
新建一個windows 窗體應用程序項目并命名為threeLayerText,路徑自己選吧,可以選擇回收站
在自動新建的窗體項目中,雙擊Form1.cs,打開窗體設計。
在窗體中添加兩個label,兩個TextBox分別命名為textBoxAccount、textBoxtextBoxPsw和一個button 命名
為 butLogin。這里命名指的是控件name屬性
為窗體添加一個應用配置文件:右鍵窗體項目文件-添加-新建項-應用程序配置文件
在配置文件<configuration>節點中添加數據庫連接語句
根據數據庫配置Initial Catalog 為數據庫名稱,User ID 為登錄數據庫賬戶,Password 為改賬號密碼
添加后app.config完整內容如下
[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> ?
添加類庫:右鍵項目解決方案-添加-新建項目-類庫,命名,確定
分別添加DAL、BAL、Model三個類庫
在Model類庫中添加userInfo類,用于在各個層之間傳遞數據
在類庫中新建一個用戶類 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層中添加數據連接、查詢操作類和方法
添加system.configuration引用,使類可以讀取配置文件節點,讀取配置文件中連接數據庫語句;右鍵引用-添加引用-選擇程序集-勾選-確定
添加 DBbase類(右鍵DAL項目-添加-新建項-命名好-確定) 用于連接數據庫,添加System.Data 和 System.Data.SqlClient 命名空間,別問我用來干嗎,其實我也不知道用來干嗎的。
創建一個基本的查詢方法用于查詢并返回記錄條數。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 ?
? ? { ?
? ? ? ? //讀取配置文件 連接數據庫語句 ?
? ? ? ? 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"; ?
? ? ? ? ??
? ? ? ? //實例化連接對象 con ?
? ? ? ? SqlConnection con = new SqlConnection(strCon); ?
??
? ? ? ? //檢測連接是否打開 ?
? ? ? ? public void chkConnection() ?
? ? ? ? { ?
? ? ? ? ? ? if (this.con.State == ConnectionState.Closed) ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? this.con.Open(); ?
? ? ? ? ? ? } ?
? ? ? ? } ?
??
? ? ? ? //執行語句,返回該語句查詢的數據行的總數 ?
? ? ? ? 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項目-添加-新建項-命名好-確定) 用執行查詢語句查找用戶輸入賬號密碼在數據庫中存在記錄條數
userAccess類完整代碼如下:
[csharp] view plain copy
using System; ?
using System.Collections.Generic; ?
using System.Linq; ?
using System.Text; ?
??
namespace DAL ?
{ ?
? ? public class userAccess ?
? ? { ?
? ? ? ? //實例化DBbase 對象 ?
? ? ? ? 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層中添加用戶輸入數據與數據庫匹配的邏輯代碼
添加Model、DAL類庫引用:右鍵BLL類庫中引用文件夾,右鍵-添加引用-選擇解決方案-項目-選中Model、DAL-確定
實例化DAL.userAccess 類,并新建一個方法調用DAL.userAccess方法,參數為Model實體類中的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); ?
? ? ? ? } ?
? ? } ?
} ?
回到窗體設計中,添加用戶輸入處理與調用BLL層方法
添加Model、DAL類庫引用:右鍵threeLayerText項目中引用文件夾,右鍵-添加引用-選擇解決方案-項目-選中Model、BLL-確定
打開窗體后臺代碼,實例化Model.userInfo 、BLL.userAccess。代碼如下
[csharp] view plain copy
//實例化model層中 userInfo類用于傳遞數據 ?
Model.userInfo m_userInfo = new Model.userInfo(); ?
??
//實例化BLL層中 userAccess方法銜接用戶輸入與數據庫匹配 ?
BLL.userAccess b_userAccess = new BLL.userAccess(); ?
雙擊登錄按鈕,添加點擊事件。代碼如下
[csharp] view plain copy
//將用戶輸入的賬號密碼 賦值給userInfo類 username、psw屬性 ?
m_userInfo.username = textBoxAccount.Text.Trim().ToString(); ?
m_userInfo.psw = textBoxPsw.Text.Trim().ToString(); ?
??
//如果BLL層中 useLogin調用返回記錄條數 大于1 則賬號密碼正確 ?
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 ?
? ? { ?
? ? ? ? //實例化model層中 userInfo類用于傳遞數據 ?
? ? ? ? Model.userInfo m_userInfo = new Model.userInfo(); ?
??
? ? ? ? //實例化BLL層中 userAccess方法銜接用戶輸入與數據庫匹配 ?
? ? ? ? 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) ?
? ? ? ? { ?
? ? ? ? ? ? //將用戶輸入的賬號密碼 賦值給userInfo類 username、psw屬性 ?
? ? ? ? ? ? m_userInfo.username = textBoxAccount.Text.Trim().ToString(); ?
? ? ? ? ? ? m_userInfo.psw = textBoxPsw.Text.Trim().ToString(); ?
??
? ? ? ? ? ? //如果BLL層中 useLogin調用返回記錄條數 大于1 則賬號密碼正確 ?
? ? ? ? ? ? if (b_userAccess.userLogin(m_userInfo) > 0) ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? MessageBox.Show("登錄成功"); ?
? ? ? ? ? ? } ?
? ? ? ? ? ? else ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? MessageBox.Show("登錄失敗"); ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? } ?
} ?
保存,可以調試了。
關于Model實體層的描述:
Model又叫實體類,這個東西,大家可能覺得不好分層。我是這樣理解的:UI<-->Model<-->BLL<-->Model<-->DAL,如此則認為Model在各層之間起到了一個數據傳輸的橋梁作用。不過在這里,我們不是把事情想簡單,而是想復雜了。
摘自:http://www.cnblogs.com/sdjxcolin/archive/2008/12/12/1353780.html 這篇文章講解了這個問題
========
C#中三層架構UI、BLL、DAL、Model實際操作
http://blog.csdn.net/zhgl7688/article/details/43669463三層架構分為:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)再加上實體類庫(Model)
1、實體類庫(Model),主要存放數據庫中的表字段。
操作:
?(1)先建立實體類庫Model,打開項目,在解決方案中右鍵--》添加--》新建項目--》選中類庫--》改名Model--》確定
(2)選中Model類庫--》Shift+ALT+C--》建立實體類。UserInfo類
[csharp] view plain copy 在CODE上查看代碼片派生到我的代碼片
namespace Model ?
{ ?
? ?public ?class UserInfo ?
? ? { ?
? ? ? ? public string ?UserName { get; set; } ?
? ? ? ? public string ?Password { get; set; } ?
? ? } ?
} ?
2、數據訪問層(DAL),主要是存放對數據類的訪問,即對數據庫的添加、刪除、修改、更新等基本操作
操作:
(1)先建立數據訪問層類庫DAL,打開項目,在解決方案中右鍵--》添加--》新建項目--》選中類庫--》改名DAL--》確定
(2)在DAL中添加對Model的引用,選中DAL--》Alt+P+R--》解決方案--》項目--》選中MOdel--》確定
(3)在DAL中添加對system.configuration的引用,選中DAL--》Alt+P+R--》程序集--》框架--》選中System.configuration--》確定
(4)建立數據訪問類,選中DAL--》Shift+ALT+C--》建立數據訪問類。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) ?
? ? ? ? { ?
? ? ? ? ? ? //對數據庫進添加一個用戶操作 ?
? ? ? ? ? ? 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上查看代碼片派生到我的代碼片
//添加其他對數據庫操作 ?
} ?
3、業務邏輯層(BLL)對傳送數據進行邏輯判斷分折,并進行傳送正確的值。
(1)先建立業務邏輯層類庫BLL,打開項目,在解決方案中右鍵--》添加--》新建項目--》選中類庫--》改名BLL--》確定
(2)在BLL中添加對Model、DAL的引用,選中BLL--》Alt+P+R--》解決方案--》項目--》選中MOdel、DAL--》確定
(3)建立業務邏輯類,選中BLL--》Shift+ALT+C--》建立業務邏輯類。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操作判斷數據庫中是否有重復值 ?
? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? userDB.AddUser(userInfo);//傳給DAL操作增加一個新用戶 ?
? ? ? ? ? ? ? ? ? ? isSuccess = true; ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? messageStr = "有相同的值"; ?
? ? ? ? ? ? } ?
? ? ? ? ? ? else ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? messageStr = "不能為空"; ?
??
? ? ? ? ? ? } ?
? ? ? ? ? ? return isSuccess;//返回界面層是否添加成功 ?
? ? ? ? } ?
? ? } ?
} ?
5、表現層(UI)即用戶界面層
(1)在UI中添加對Model、BLL的引用,選中UI--》Alt+P+R--》解決方案--》項目--》選中MOdel、BLL--》確定
(2)編寫代碼傳遞數據給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(); ?
? ? ? ? } ?
??
? ? } ?
} ?
========
用三層架構來做winform程序
http://blog.csdn.net/clb929/article/details/54295211? 三層架構是一種代碼分層思想,簡單的說就是將一個項目分為界面展示、業務邏輯、數據訪問三層,各層之間保持一定的獨立性,降低代碼之間的耦合性,這樣做的好處是顯而易見的:
1、各層之間的改動不會影響到其他層(比較大的變動除外,如果客戶要求業務流程、數據庫結構都變了,你還期望有什么不會變呢)
2、基本不用寫SQL語句了,自動生成的代碼是參數化查詢,可以防止SQL注入
3、代碼條理清楚,便于理解
? 當然三層架構不是拯救一切的靈丹妙藥,比如:
1、比較小的項目何必糾結用什么架構呢,在你琢磨架構的時候,用winform可能已經寫完了
2、速度會有所降低,相對于直接訪問數據庫,三層架構增加了中間層,速度降低是肯定的
? 說到三層架構,可能第一時間想到的就是mvc,然而三層架構并不是web的專利,歸根結底,三層架構只是一種代碼分層思想,winform當然也可以用,只不過界面展示這塊,mvc是網頁的形式,winform是windows窗體,其他兩層思路是一樣的。
? 下面就以一個非常簡單常見的商鋪展示程序來實際講解winform中如何實現三層架構。
一、前期準備
1、動軟代碼生成器,國產神器,你值得擁有,全自動生成數據訪問層代碼,百度就能找到,最后一版是2.78,作者沒有繼續更新了。已經免費開源,喜歡研究源代碼的可以繼續擴展。
李天平的博客
http://blog.csdn.net/litp
http://www.cnblogs.com/ltp/category/44293.html
2、SQLiteStudio,選擇SQLite數據庫是因為輕巧、無需安裝,對于這個示例程序足夠用了 ?,SQLiteStudio是免費好用的SQLite數據庫圖形化管理工具,百度可得綠色版。
二、開發過程
1、下載動軟代碼生成器,安裝完成之后運行,連接到附件示例程序的SQLite數據庫,打開連接,右鍵點擊數據庫,選擇“新建.net項目”,選擇“簡單三層結構”,下一步,選擇“Shops”、“Users”兩個表,點擊“開始生成”。
2、來到生成目錄,打開源代碼,可以看到5個項目,下面分別說說他們的作用
BLL--業務邏輯層,所有的業務邏輯全部寫在這里,動軟已經為每個表自動生成了一個業務類,類名就是表名,BasicMethod區段是自動生成的一些基礎方法,比如增刪改查、分頁查詢這些,ExtensionMethod區段是空的,我們自己寫的業務代碼寫在這個區段。
DAL--數據訪問層,所有的數據庫訪問的基礎方法寫在這里,動軟已經為每個表自動生成了一個數據訪問類,類名就是表名,BasicMethod區段是自動生成的一些基礎方法,比如增刪改查、分頁查詢這些,ExtensionMethod區段是空的,如果我們覺得這些基礎的數據庫操作方法不夠用,可以在這個區段添加自己的數據庫操作方法,但是只有數據庫的操作方法應該寫在DAL類庫。
DBUtility--數據庫訪問的基礎類庫,封裝了MySQL,Sql,OLE,SqlLite,Oracle等數據庫訪問的方法,與ADO.NET相關的connection,DataAdapter,Command等全部在這里,DAL是在DBUtility基礎上的進一步封裝的,這個類庫基本不需要修改。
Model--數據庫表結構的映射,每一個類名代表數據庫中的一個相同名字的表,類的每一個字段、屬性表示表中對應的字段,數據庫的一條記錄就對應類的一個對象,這個類庫基本不需要修改。
Web-- 一些基礎的網頁,因為我們是做winform的,所以這個不需要了,但是先別急著刪,等下我們還要來拷連接字符串。
最后在解決方案文件夾下有一個Lib文件夾,是一些動態鏈接庫,看看上述每個項目缺什么就引用什么。
3、新建一個winform項目,在項目的屬性里將目標框架設置為".net framework 4"(不是".net framework 4 profile"),這樣就有一個app.config文件了,打開app.config,打開Web項目根目錄下的Web.config文件,將appSettings整個一節拷貝到app.config文件configuration節點內,將連接字符串修改為SqlLite的格式,刪除Web項目。
? 補充一點,我們的程序是怎么得到連接字符串的呢?在DBUtility類庫里,有一個PubConstant類,里面有一個ConnectionString屬性,通過ConfigurationManager.AppSettings["ConnectionString"]讀取了app.config文件里保存的連接字符串。
? 接下來就是開始做界面,寫代碼了,winform相信大家都很熟悉了,具體過程我就不多說了,直接上源代碼。
? 示例程序源代碼:
http://pan.baidu.com/s/1jIRZkfO
總結:
1、動軟自帶的SQLite動態鏈接庫比較老,用他原來的運行不起來,我換成了新版的,在Lib文件夾下的SQLite.Interop.dll和System.Data.SQLite.DLL,System.Data.SQLite.DLL需要在項目中引用,SQLite.Interop.dll要手動拷貝到生成目錄
2、如果代碼寫完后數據庫結構發生了變化(比如增加了一個字段),我能想到的辦法就是重新用動軟生成一次,將BLL,DAL,DBUtility,Model替換掉,所以最好這幾個項目中不要寫自己的代碼了,要擴展的話重新建項目吧。為什么不推薦手動改呢,因為即便是增加一個字段,也可能涉及到幾個類的修改,改動大就更不用說了,手動改代碼的話很有可能漏掉,能用最簡單的辦法搞定的事就用最簡單的辦法。
========
總結
以上是生活随笔為你收集整理的在winform中使用三层架构学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++ 解析JSON 学习总结
- 下一篇: 图解使用CURL下载和上传文件