抽象工厂切换数据库连接
本人今儿闲来无事,随便写点东东吧,是设计模式里面关于抽象工厂的应用,其实关于抽象工厂的概念再此我就不多说了,有兴趣的朋友可以去参考各类书籍或是技术文章,里面都有详细的介绍。我现在就注重代码的实现吧,完成一个往不同数据库中添加数据的例子,先声明一点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 通用数据层框架