ASP.NET三層結構演化構建之五——啥都能用

如果用戶有一天要使用多種數據庫或者是更改原先的數據庫種類,那我們原來的三層結構就抗不住啦。

 

所以在完成項目的時候,要添加多數據庫支持。

 

在這裏先給大家介紹倆概念。

 

第一個是簡單工廠模式。

簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。

簡單工廠模式中包含三個角色:

工廠(Creator)角色

簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。

抽象(Product)角色

簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。

具體產品(Concrete Product)角色

是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。

一般來講它是抽象產品類的子類,實現了抽象產品類中定義的所有接口方法。

 

第二個是.NET中的反射。

程序集包含模塊,而模塊包含類型,類型又包含成員。 反射則提供了封裝程序集、模塊和類型的對象。 您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。 然後,可以調用類型的方法或訪問其字段和屬性。

上面的那一堆理解起來有點困難的話,我給解釋一下。我的項目中用到的反射的功能就是根據需要對程序集進行加載。

 

現在開始實施。

 

首先是建立數據庫訪問的接口類,存放在IDAL層中。只要繼承於IDAL中的接口,就可以實現數據訪問。

 

建立一個類庫項目IDAL,添加IUser.cs

IDALIUser中的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,表示目前使用的DALSQLServerDAL。用戶可以根據自己的需求更改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實例。

 

嘿嘿。

 

項目示例下載:http://download.csdn.net/source/2946951 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章