這些天,我有將網上一開源的文檔流轉功能用抽象三層架構來轉化實現,碰到一個問題,錯誤截圖如下:
我按照提示,檢查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;
}
}
}