1、最近在CSDN上看到有朋友求Winform的三层架构的示例,网上也确实没有多少是Winform的。于是本人牺牲一点时间,做了这个小Demo,希抛砖引玉,望各路老手不吝指教。 至于什么是“三层结构”、三层结构有什么好处、为什么要用三层结构,我想这些讨论,网上大把,Google 或者 Baidu一下就有一大串。我也就不多说,直接用一个例子来讲述如何实现一个多层架构的WinForm程序。 在该例子,我选用的是VS.net 2005 + Access 实现,考虑至数据库的可移槙性,数据访问层使用工厂模式,利用.net 的反射在运行时根据配置文件来动态决定采用何用数据库。 好了,进入正题:
2、 首先,设定数据库如下 : 字段名称 数据类型 默认值 备注说明 BS_NO Text N'' 工号 BS_NAME Text N‘’ 姓名 对于,多层架构,我一般都按照预先新建一个空的方案。然后分别新加EntityReflect(实体层)、DALFactory(数
3、据访问层,工厂类), Business(中间业务层)、WinForm(表示界面层),并设定WinForm为启始专案,该专案为WinForm模板,其它全部可作为 Class Library模板,设定各专案的相依:Business依赖DALFactory、WinForm依赖Business,完了之后,选取整个方案,编译。在Business层引用DALFactory、WinForm层中引用Business.至上上面的数据访问层并没有针对特定的数据库的数据访问类,所以,再加一个DataAccess Class Library层,该层就是专门针对Access数据访问的。同样设定该层依赖DALFactor
4、y,并参考引用DALFactory.再次编译一次,我们就进入代码编制阶段了。 其实,我们上面的操作,已基本上具备了我上面所说了这个Demo的全部内容了,只是还没有代码而已啦。好,下面我们就添加代码: 打开EntityReflect专案,将默认的Class1.cs 改为EREmployee.cs,这就是我们的实体规范层,关于这个,我们可以在网上下载一些工具自动生成。不过,在我这个方案,我却一直没有在任何地方引用他。原因其实是我自己也不是很能弄清为什么一定要这个规范层。不过,我还是写了如下的代码: using System; using System.Collections.Gener
5、ic; using System.Text; namespace EntityReflect { public class EREmployee { public EREmployee() { } private String strbs_no; private String strbs_name; public String strBS_NO { get { return strbs_no; } set { strbs_no = value; } } public String strBS_NAME { get { return strbs_name; }
6、 set { strbs_name = value; } } } } 展开DALFactory层.新加一个IDataAccessObject.cs,目的是为了规范各种数据库访问数据库时使用相同的方法,该接口的代码如下: using System; using System.Data; namespace DALFactory { public interface IDataAccessObject { void Query(DataSet ds, string strTableName); void Save(string strBS_NO, string str
7、BS_NAME); } } 另外,由于我使用了C#的RTTI,所以,还加了一个类GetDatabaseType.cs,代码如下: using System; using System.Configuration; using System.Reflection; namespace DALFactory { public class GetDatabaseType { public IDataAccessObject GetDatabase() { string strAssemblyName = ConfigurationManager.AppSettings["
8、AssemblyName"]; string strConstractor = ConfigurationManager.AppSettings["Constractor"]; return (IDataAccessObject)Assembly.Load(strAssemblyName).CreateInstance(strConstractor, false); } } } 有了数据访问层的工厂,展开DataAccess数据访问层,将默认的Class1.cs 改为DataAccess.cs,输入以下代码: using System; using System.Data;
9、 using System.Data.OleDb; using DALFactory; namespace DataAccess { public class DAOAccess:IDataAccessObject { private const string strConn = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source=D:\SHS_Develop\Solution\DB\Solution.mdb"; #region IDataAccessObject 成員 public void Query(System.Data.
10、DataSet ds, string strTableName) { string strSql = @"Select * From Employee"; using (OleDbConnection Conn = new OleDbConnection(strConn)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(strSql, Conn)) { adapter.Fill(ds, strTableName); } } } public void Save(string strBS_NO, strin
11、g strBS_NAME) { string strSql = @"Insert Into Employee(BS_NO,BS_NAME) Values(@BS_NO,@BS_NAME)"; using (OleDbConnection Conn = new OleDbConnection(strConn)) { using (OleDbCommand Comm = new OleDbCommand(strSql, Conn)) { Comm.Parameters.Add(new OleDbParameter("@BS_NO", OleDbType.VarChar,10));
12、Comm.Parameters.Add(new OleDbParameter("@BS_NAME", OleDbType.VarChar, 10)); Comm.Parameters["@BS_NO"].Value = strBS_NO; Comm.Parameters["@BS_NAME"].Value = strBS_NAME; Conn.Open(); Comm.ExecuteNonQuery(); Conn.Close(); } } } #endregion } } 展开Business层,将Class1.cs改为:BusinessLogic.cs,输入
13、如下代码: using System; using DALFactory; namespace Business { public class BusinessLogic { public void Query(System.Data.DataSet ds, string strTableName) { (new GetDatabaseType()).GetDatabase().Query(ds, strTableName); } public void Save(string strBS_NO, string strBS_NAME) { (new GetDataba
14、seType()).GetDatabase().Save(strBS_NO, strBS_NAME); } } } 最后,展开WinFrom层,在窗体上拖一个DatagridView、两个label,两个textBox和两个button过来,Name属性分别改为:FrmMain、dgvMain、tbxBS_NO,tbxBS_NAME,btnQuery,btnSave,输入如下代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;
15、using System.Drawing; using System.Text; using System.Windows.Forms; using Business; using RealBusiness; namespace WinForm { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void btnQuery_Click(object sender, EventArgs e) { DataSet ds = new Dat
16、aSet(); (new BusinessLogic()).Query(ds,"Employee"); this.dgvMain.DataSource = ds; this.dgvMain.DataMember = "Employee"; } private void btnSave_Click(object sender, EventArgs e) { if (!RBEmployee.CanRegistUser(tbxBS_NO.Text)) { MessageBox.Show("The Business Logic Can't Allow to Add this user "); return; } (new BusinessLogic()).Save(tbxBS_NO.Text, tbxBS_NAME.Text); } } }






