抽象工厂切换数据库连接
本人今儿闲来无事,随便写点东东吧,是设计模式里面关于抽象工厂的应用,其实关于抽象工厂的概念再此我就不多说了,有兴趣的朋友可以去参考各类书籍或是技术文章,里面都有详细的介绍。我现在就注重代码的实现吧,完成一个往不同数据库中添加数据的例子,先声明一点2个数据库之间是可以切换的。下面我就把具体的代码给共享出来。我写此文章的目的在于能帮助初学者学到更多的知识,当然如果是程序开发高手可以完全飘过喔。
Models层:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Models { public class Stuinfo { public int stuno { get; set; } public string stuname { get; set; } public string password { get; set; } public int age { get; set; } public string sex { get; set; } public Stuinfo() { } } }
IDAL层:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Models; namespace IDAL { public interface IStuinfo { /// <summary> /// /// </summary> /// <returns></returns> List<Stuinfo> findAllStuinfo(); /// <summary> /// /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> int addStuinfo(Stuinfo stuinfo); /// <summary> /// 有输入参数和输出参数的存储过程 /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> int addStuinfoTest1(Stuinfo stuinfo); /// <summary> /// 同时具有返回值、输入参数、输出参数的存储过程 /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> int addStuinfoTest2(Stuinfo stuinfo); } }
DAL2005层:
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using IDAL; using Models; namespace DAL2005 { public class StuinfoDAL:IStuinfo { /// <summary> /// /// </summary> /// <returns></returns> public List<Stuinfo> findAllStuinfo() { List<Stuinfo> list = new List<Stuinfo>(); using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString)) { try { sqlconnection.Open(); SqlCommand sqlcommand = new SqlCommand("Categoriestest1",sqlconnection); sqlcommand.CommandType = CommandType.StoredProcedure; using(SqlDataReader reader = sqlcommand.ExecuteReader(CommandBehavior.CloseConnection)) { while(reader.Read()) { Stuinfo stuinfo = new Stuinfo() { stuno = (int)reader["stuno"], stuname = reader["stuname"].ToString(), password = reader["password"].ToString(), sex = reader["sex"].ToString(), age = (int)reader["age"] }; list.Add(stuinfo); } } } catch (Exception) { throw; } return list; } } /// <summary> /// /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> public int addStuinfo(Stuinfo stuinfo) { using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString)) { try { sqlconnection.Open(); SqlCommand sqlcommand = new SqlCommand("Categoriestest3",sqlconnection); sqlcommand.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new SqlParameter("@stuname",SqlDbType.VarChar,45), new SqlParameter("@password",SqlDbType.VarChar,45), new SqlParameter("@sex",SqlDbType.VarChar,45), new SqlParameter("@age",SqlDbType.Int,4), new SqlParameter("@count",SqlDbType.Int,4) }; parameters[0].Value = stuinfo.stuname.ToString(); parameters[1].Value = stuinfo.password.ToString(); parameters[2].Value = stuinfo.sex.ToString(); parameters[3].Value = stuinfo.age; parameters[4].Direction = ParameterDirection.ReturnValue; foreach(SqlParameter parameter in parameters) { sqlcommand.Parameters.Add(parameter); } sqlcommand.ExecuteNonQuery(); int count = int.Parse(sqlcommand.Parameters["@count"].Value.ToString()); return count; } catch (Exception) { throw; } } } /// <summary> /// 有输入参数和输出参数的存储过程 /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> public int addStuinfoTest1(Stuinfo stuinfo) { using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString)) { try { sqlconnection.Open(); SqlCommand sqlcommand = new SqlCommand("Categoriestest4",sqlconnection); sqlcommand.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new SqlParameter("@stuno",SqlDbType.Int,4), new SqlParameter("@stuname",SqlDbType.VarChar,45), new SqlParameter("@password",SqlDbType.VarChar,45), new SqlParameter("@sex",SqlDbType.VarChar,45), new SqlParameter("@age",SqlDbType.Int,4) }; parameters[0].Direction = ParameterDirection.Output; parameters[1].Value = stuinfo.stuname.ToString(); parameters[2].Value = stuinfo.password.ToString(); parameters[3].Value = stuinfo.sex.ToString(); parameters[4].Value = stuinfo.age; foreach(SqlParameter parameter in parameters) { sqlcommand.Parameters.Add(parameter); } sqlcommand.ExecuteNonQuery(); int count = int.Parse(sqlcommand.Parameters["@stuno"].Value.ToString()); return count; } catch (Exception) { throw; } } } #region IStuinfo 成员 /// <summary> /// 同时具有返回值、输入参数、输出参数的存储过程 /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> public int addStuinfoTest2(Stuinfo stuinfo) { using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString)) { try { sqlconnection.Open(); SqlCommand sqlcommand = new SqlCommand("Categoriestest6",sqlconnection); sqlcommand.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new SqlParameter("@stuno",SqlDbType.Int,4), new SqlParameter("@stuname",SqlDbType.VarChar,45), new SqlParameter("@password",SqlDbType.VarChar,45), new SqlParameter("@sex",SqlDbType.VarChar,45), new SqlParameter("@age",SqlDbType.Int,4), new SqlParameter("@count",SqlDbType.Int,4) }; parameters[0].Direction = ParameterDirection.Output; parameters[1].Value = stuinfo.stuname.ToString(); parameters[2].Value = stuinfo.password.ToString(); parameters[3].Value = stuinfo.sex.ToString(); parameters[4].Value = stuinfo.age; parameters[5].Direction = ParameterDirection.Output; foreach(SqlParameter parameter in parameters) { sqlcommand.Parameters.Add(parameter); } sqlcommand.ExecuteNonQuery(); int count = int.Parse(sqlcommand.Parameters["@count"].Value.ToString());//用户名状态(0表示用户名没有注册,1表示用户名已经被注册) if (count == 0) { int newStuno = int.Parse(sqlcommand.Parameters["@stuno"].Value.ToString()); } return count; } catch (Exception) { throw; } } } #endregion } }
DALFactory层:
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Reflection; using System.Text; using IDAL; namespace DALFactory { public abstract class AbstractorDALFactory { /// <summary> /// switch语句实现抽象工厂 /// </summary> /// <returns></returns> public static AbstractorDALFactory chooseFactory() { string type = ConfigurationManager.AppSettings["type"]; AbstractorDALFactory factory = null; switch (type) { case "sql2005": { factory = new Sql2005DALFactory(); break; } } return factory; } /// <summary> /// 反射实现抽象工厂 /// </summary> /// <returns></returns> public static AbstractorDALFactory reflectionChooseFactory() { string type = ConfigurationManager.AppSettings["type"].ToString(); AbstractorDALFactory factory = null; factory = (AbstractorDALFactory)Assembly.Load("DALFactory").CreateInstance(type); return factory; } /// <summary> /// /// </summary> /// <returns></returns> public abstract IStuinfo createIStuinfo(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DAL2005; using IDAL; namespace DALFactory { public class Sql2005DALFactory:AbstractorDALFactory { /// <summary> /// /// </summary> /// <returns></returns> public override IStuinfo createIStuinfo() { return new StuinfoDAL(); } } }
BLLFactory层:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DALFactory; using IDAL; namespace BLLFactory { public static class ProxyFactory { /// <summary> /// /// </summary> static ProxyFactory() { AbstractorDALFactory factory = AbstractorDALFactory.reflectionChooseFactory(); istuinfo = factory.createIStuinfo(); } /// <summary> /// /// </summary> public static IStuinfo istuinfo { get; set; } } }
BLL层:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Models; using BLLFactory; namespace BLL { public class StuinfoBLL { /// <summary> /// /// </summary> /// <returns></returns> public static List<Stuinfo> findAllStuinfo() { return ProxyFactory.istuinfo.findAllStuinfo(); } /// <summary> /// /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> public static int addStuinfo(Stuinfo stuinfo) { return ProxyFactory.istuinfo.addStuinfo(stuinfo); } /// <summary> /// /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> public static int addStuinfoTest1(Stuinfo stuinfo) { return ProxyFactory.istuinfo.addStuinfoTest1(stuinfo); } /// <summary> /// /// </summary> /// <param name="stuinfo"></param> /// <returns></returns> public static int addStuinfoTest2(Stuinfo stuinfo) { return ProxyFactory.istuinfo.addStuinfoTest2(stuinfo); } } }
Web.config:
<appSettings> <add key="type" value="DALFactory.Sql2005DALFactory"/> </appSettings> <connectionStrings> <add name="sql2005" connectionString="server=TERRYSHE-3FCE6E\TERRYSHEN;database=master;uid=sa;"/> <add name="mysql" connectionString="server=localhost;database=test;uid=root;pwd=123456"/>
上述代码是抽象工厂中的核心部分,连接的是SQL数据库,如果想换成ORACLE数据库,你们想想代码应该怎么实现。如果有任何的问题,可以随时联系我。感谢大家花时间来看我写的破文章。
QQ:936944308 沈宇峰
MSN:yufengshen@msn.cn
关键字 抽象工厂切换数据库连接
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架