如果用户有一天要使用多种数据库或者是更改原先的数据库种类,那我们原来的三层结构就抗不住啦。
所以在完成项目的时候,要添加多数据库支持。
在这里先给大家介绍俩概念。
第一个是简单工厂模式。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
简单工厂模式中包含三个角色:
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。
第二个是.NET中的反射。
程序集包含模块,而模块包含类型,类型又包含成员。 反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。 然后,可以调用类型的方法或访问其字段和属性。
上面的那一堆理解起来有点困难的话,我给解释一下。我的项目中用到的反射的功能就是根据需要对程序集进行加载。
现在开始实施。
首先是建立数据库访问的接口类,存放在IDAL层中。只要继承于IDAL中的接口,就可以实现数据访问。
建立一个类库项目IDAL,添加IUser.cs。
IDAL和IUser中的I就是接口(Interface)的意思啦。这个是简单工厂中的抽象角色。
在数据访问接口类中也要添加对Model的引用。
IUser.cs的内容如下:
using Model;
namespace IDAL
{
public interface IUser
{
/// <summary>
/// 根据用户Id获取用户信息
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户信息</returns>
UserInfo GetUserInfo(string userId);
}
}
接下来就是写子类继承于IDAL中的接口了。
原先有一个项目,叫DAL,是使用SQL Server的。现在添加了多数据库支持,我们将原来的DAL改成SQLServerDAL。
注意。要将命名空间也改成SQLServerDAL。
右击SQLServerDAL项目,选择属性,如图:
将程序集名称和默认命名空间由原先的DAL更改为SQLServerDAL,并对项目添加IDAL的引用。
User类应该实现IUser接口。所以User.cs的内容如下:
using System.Data;
using System.Data.SqlClient;
using DBUtility;
using IDAL;
using Model;
namespace SQLServerDAL
{
public class User : IUser
{
private const string SQL_SELECT_USERINFO_BY_USERID = "SELECT * FROM [User] WHERE UserId = @UserId";
private const string PARM_USERID = "@UserId";
/// <summary>
/// 根据用户Id获取用户信息
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户信息</returns>
public UserInfo GetUserInfo(string userId)
{
UserInfo user = null;
SqlParameter parm = new SqlParameter(PARM_USERID, SqlDbType.VarChar, 10);//参数UserId
parm.Value = userId;//给参数赋值
using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_USERINFO_BY_USERID, parm))
{
if (rdr.Read())
{
user = new UserInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetBoolean(2), rdr.GetString(3), rdr.GetBoolean(4), rdr.GetInt16(5));
}
else user = new UserInfo();
}
return user;
}
}
}
接下来是创建简单工厂中的工厂角色了。我们这里的工厂是要生产符合我们要求的DAL层。根据web.config中的配置,创建想要的DAL,如SQLServerDAL,AccessDAL等。
打开web.config,找到<appSettings />,将其修改为:
<appSettings>
<add key="DAL" value="SQLServerDAL"/>
</appSettings>
这样就创建了一个配置项,名称为DAL,值为SQLServerDAL,表示目前使用的DAL为SQLServerDAL。用户可以根据自己的需求更改value的值。当然,前提是项目中实现了相应的DAL。我们这里先设置为SQLServerDAL。
工厂角色要新建一个层。新建类库项目,命名为: DALFactory,然后新建一个密封类DataAccess作为生成相应继承于IDAL的类。并对DALFactory添加对IDAL的引用。
DataAccess.cs的具体内容如下:
using System.Configuration;
using System.Reflection;
using IDAL;
namespace DALFactory
{
public sealed class DataAccess
{
private static readonly string path = ConfigurationManager.AppSettings["DAL"];//获取web.config中的配置,得到所需的IDAL的具体实现
private DataAccess() { }
public static IUser CreateUser()
{
string className = path + ".User";//具体的类名
return (IUser)Assembly.Load(path).CreateInstance(className);//加载相应的程序集,创建实例并转换为相应的接口类型
}
}
}
对BLL添加对IDAL的引用。这样我们就可以在BLL中调用DALFactory中相应的Create方法来创建DAL示例。BLL中的User.cs如下:
using IDAL;
using DALFactory;
namespace BLL
{
public class User
{
private static readonly IUser dal = DataAccess.CreateUser();
/// <summary>
/// 根据用户Id获取用户密码
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户密码</returns>
public string GetUserPassword(string userId)
{
return dal.GetUserInfo(userId).Password;
}
/// <summary>
/// 根据用户Id获取用户姓名
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户姓名</returns>
public string GetUserName(string userId)
{
return dal.GetUserInfo(userId).UserName;
}
}
}
这样就完成了通过简单工厂模式对多数据库的支持。为了更好地说明实现的原理,我提供的源代码中还提供了Access数据库以及对Access数据库的支持类AccessDAL。同志们可以研究一下。
总结一下多数据库支持的实现流程吧。
1. 在数据库配置文件中添加配置属性,用于存放DAL类型配置。
2. 创建简单工厂模式中的抽象角色,即创建IDAL层,对DAL的实现进行规范
3. 创建简单工厂模式中的产品角色,即创建继承于IDAL层中的接口的类。这里的类是不同数据库对IDAL中接口的具体实现。
4. 创建简单工厂模式中的工厂角色,即创建DALFactory层,用于产生所需的DAL
5. 在BLL中调用DALFactory中相应的方法,创建所需的DAL实例。
嘿嘿。