無法反射創建類實例錯誤的解決

這些天,我有將網上一開源的文檔流轉功能用抽象三層架構來轉化實現,碰到一個問題,錯誤截圖如下:

斷言失敗

 

我按照提示,檢查DALFactory.cs中第241行,其代碼如下:

objType = Assembly.Load(path).CreateInstance(CacheKey);

這處,其原理是利用反射機制創建類實例。我唯有改成創建我需要的某一個具體的類進行調試的時候,問題纔得到解決,但那樣違背了抽象三層架構與具體數據庫不相關的良好用意,只好改回來,反覆調試,問題依舊。

於是我開始覈對之前採用抽象三層架構開發的另一項目,其思路並無二致。我編譯運行後一系統,沒報任何錯,真是奇了怪了!繼續觀察,終於搞清楚問題所在,原來現在這個系統中Assembly不是有關程序集操作的類,以業務邏輯層爲例,系統所定義自動生成的名稱空間是OI.BLL,但建立的工程名是BLL,程序集名稱也是BLL。我通過將各工程的程序集名稱改成命名空間的前綴(在此要修改一下程序集的名稱“工程名”->“屬性”裏面就以修改),這樣就調試通過了。

下面是DALFactory整個類DataAccess的源碼:

using System;

using System.Reflection;

using System.Configuration;

using OI.IDAL;

namespace OI.DALFactory

{

       /// <summary>

       /// 抽象工廠模式創建DAL

       /// web.config 需要加入配置:(利用工廠模式+反射機制+緩存機制,實現動態創建不同的數據層對象接口) 

       /// DataCache類在導出代碼的文件夾裏

       /// 可以把所有DAL類的創建放在這個DataAccess類裏      

       /// </summary>

       public sealed class DataAccess

       {

              private static readonly string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];

              /// <summary>

              /// 創建對象或從緩存獲取

              /// </summary>

              public static object CreateObject(string path,string CacheKey)

              {

                     object objType = DataCache.GetCache(CacheKey);//從緩存讀取

                     if (objType == null)

                     {

                            try

                            {

                                   objType = Assembly.Load(path).CreateInstance(CacheKey);//反射創建

                                   DataCache.SetCache(CacheKey, objType);// 寫入緩存

                            }

                            catch

                            {}

                     }

                     return objType;

              }

              /// <summary>

              /// 創建authors數據層接口

              /// </summary>

              public static OI.IDAL.Iauthors Createauthors()

              {

 

                     string CacheKey = path+".authors";

                     object objType=CreateObject(path,CacheKey);

                     return (OI.IDAL.Iauthors)objType;

              }

}

}

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