如果用戶有一天要使用多種數據庫或者是更改原先的數據庫種類,那我們原來的三層結構就抗不住啦。
所以在完成項目的時候,要添加多數據庫支持。
在這裏先給大家介紹倆概念。
第一個是簡單工廠模式。
簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
簡單工廠模式中包含三個角色:
工廠(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實例。
嘿嘿。