C#用工廠模式、反射機制和緩存機制來設計數據訪問層的接口總結

        最近做項目,使用的是三層架構,在創建數據訪問層接口的時候,使用的是反射和緩存機制,但是在運行的時候,總是提示不成功,測試發現反射機制出現問題,沒有生成反射對應的類,加載失敗,和別人寫的代碼進行對比,發現代碼一模一樣,很是崩潰,後來想到是不是配置文件裏出現了錯誤,打開web.config,和別人的進行對比,還是一樣的,沒有出現錯誤,但是爲什麼別人的可以運行,而我的就是運行失敗呢,最後通過網上查找,終於解決了這個問題,原來是因爲反射中加載的程序集的名稱與程序集在項目中的名稱不一致造成的,最後修改項目中程序集的屬性名稱,再次運行,終於成功了!下面對遇到的問題進行簡單的總結:


    工廠模式,就是類似像工廠生產東西一樣的意思。只需得到出廠的東西,具體怎麼生產就不知道了。拿程序來說,就是自己定義一個類,這個類當中會有很多方法,而這些方法就是創建對象的作用,用這個類的人只需知道調用哪個方法得到哪個具體對象,至於怎麼得到就不用管了。

  反射機制,其實也很簡單,就是一個類,可以利用反射機制得到自己有多少個方法,屬性,方法名等等,這時候就可以判斷這個類有無這個屬性,或這個方法。從而調用該方法。  

   緩存機制,主要作用就是緩存一些數據。在這裏不知道他到底有什麼作用。但緩存機制就是起一個緩存,然後等下次調用的時候就直接從緩存中取數據。 這跟你的IE瀏覽器瀏覽網頁是一個道理的。

  動態創建數據訪問層對象,也就是創建一些接口來編程了。比較靈活點。具體接口的實現就交給工廠模式去實現

 

  示例項目DALFactory是採用工廠模式設計的,使用它可以根據需求返回不同的實例對象,在DALFactory項目中使用反射機制來實現依賴注入,當然它的實現還可以更靈活,強大,有興趣的朋友可以去研究。   

   

部分代碼如下:

web.config中對應的命名空間值:

<appSettings>
    <add key="SQLDAL" value="Test.DAL"/>
</appSettings>
利用DAL層工廠模式DALFactory創建DAL接口(下例中是創建了jc_bm數據層接口):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using Test.DAL;
using System.Reflection;

namespace Test.DALFactory
{
    /// <summary>
    /// 操作數據庫的工廠類,用於實現IDAL(持久層接口)
    /// </summary>
    public sealed class DataAccess
    {
        private static readonly string AssemblyPath = ConfigurationManager.AppSettings["SQLDAL"];  
        private DataAccess() { }
        /// <summary>
        /// 創建對象或從緩存獲取
        /// </summary>
        public static object CreateObject(string AssemblyPath, string ClassNamespace)
        {
            object objType = DataCache.GetCache(ClassNamespace);//從緩存讀取
            if (objType == null)
            {
                try
                {
                    objType = Assembly.Load(AssemblyPath).CreateInstance(ClassNamespace);//反射創建
                    DataCache.SetCache(ClassNamespace, objType);// 寫入緩存
                }
                catch
                { }
            }
            return objType;
        }  
        /// <summary>
        /// 創建jc_bm數據層接口
        /// </summary>
        public static Test.IDAL.Ijc_bm Createjc_bm()
        {
            
            string ClassNamespace = AssemblyPath + ".jc_bm";
            object objType = Test.DALFactory.DataAccess.CreateObject(AssemblyPath, ClassNamespace);
            return (Test.IDAL.Ijc_bm)objType;
        }}}

  由這一個類,就可以獲取需要用的數據訪問層的實例,可是,我在使用過程中卻總是拋出異常,[System.IO.FileNotFoundException] = {"未能加載文件或程序集“Test.DAL”或它的某一個依賴項。系統找不到指定的文件。":"Test.DAL"} ,再看DAL層在項目集中的名稱:

                      

其中的Assembly name指的是DAL層在項目中的名稱,而我們在web.config配置文件中設置的“SQLDAL”的值爲"Test.DAL",這兩個名字應該是一致的,只有這樣反射機制才能在項目中找到需要的類,由於Assembly name我設置的是DAL,所以在反射的時候找不到所需要的類文件,把DAL改爲Test.DAL,重新運行就成功了。


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