| 導購 | 订阅 | 在线投稿
分享
 
 
 

使用C#的反射機制時遇到的問題

2006-12-16 17:29:10  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

項目DALFactory是采用工廠模式設計的,設計模式的書我也曾看過Java的設計模式,理解也不太深刻,但對工廠模式還是較爲熟悉,使用它可以根據需求返回不同的實例對象,在DALFactory項目中使用反射機制來實現依賴注入,當然,它的實現還是沒有java中的spring那樣靈活,強大,部分代碼如下:

// <summary>

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

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

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

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

/// <appSettings>

/// <add key="DAL" value="SmsSystem.SQLServerDAL" /> (這裏的命名空間根據實際情況更改爲自己項目的命名空間)

/// </appSettings>

/// </summary>

public sealed class DataAccess

{

private static readonly string path = ConfigurationManager.AppSettings["DAL"];

/// <summary>

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

/// </summary>

public static object CreateObject(string path, string CacheKey)

{

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

if (objType == null)

{

try

{

//Assembly ass = new Assembly();

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

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

}

catch(System.Exception ex)

{

string str = ex.Message;//

SmsSystem.Utility.SaveLog.SaveInfoToLog(str, "errorLog", "異常");

}

}

return objType;

}

/// <summary>

/// 不使用緩存,創建對象

/// </summary>

private static object CreateObjectNoCache(string path, string CacheKey)

{

try

{

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

return objType;

}

catch//(System.Exception ex)

{

//string str=ex.Message;// 記錄錯誤日志

return null;

}

}

/// <summary>

/// 創建CustEmployee數據層接口

/// </summary>

public static SmsSystem.IDAL.ICustEmployee CreateCustEmployee()

{

string CacheKey = path + ".CustEmployee";

object objType = CreateObject(path, CacheKey);

return (ICustEmployee)objType;

}

………………(其它數據層接口)

}

由這一個類,就可以獲取需要用的數據訪問層的實例,可是,我在使用過程中卻總是抛出異常,[System.IO.FileNotFoundException] = {"未能加載文件或程序集「SmsSystem.SQLServerDAL」或它的某一個依賴項。系統找不到指定的文件。":"SmsSystem.SQLServerDAL"} ,說實話,對于C#這排錯和調試我還手生,我百思不得其解,爲什麽會一用反射就異常呢,整個上去我去看反射的IPA,感覺我的用法沒錯誤啊,況且,我看PetShop的例子就是這樣差不多的寫法,它爲什麽能用,下午調試了好久還是在出錯,我發狠心去和petShop去對比,後來終于發現,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll這樣的名字,而我的就是個SQLServerDAL.dll,我感覺極有可能是這裏有問題,因爲在wb.config裏我配置過

<appSettings>

<add key="DAL" value="SmsSystem.SQLServerDAL"/>

…………

</appSettings>

這樣一個程序集,搞了好久,請教別人,結果弄清楚,是要項目的屬性裏設置程序集的名稱,就可以生成SmsSystem.SQLServerDAL.dll這樣的dll文件

王朝网络

設置,重新生成 ,又出了一點問題,

類型「SmsSystem.BLL.CustEmployee」同時存在于「c:\Windows\Microsoft.net\Framework\v2.0.50727\Temporary ASP.NET Files

\smssystem\3358d7f2\16ba9bb7\assembly\dl3\7296d5df\40ded961_96d8c601\BLL.DLL」

和「c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\smssystem\3358d7f2

\16ba9bb7\assembly\dl3\644d894c\4cf8840a_9ad8c601\SmsSystem.BLL.DLL」

中 G:\ASP.NET\SmsSystem\Default.aspx.cs 22

我仔細一看,原來在web項目的bin下面,原來的SQLServerDAL.dll還在,又多了個SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一個沒有自動刪除掉的多余文件,昨天是一個項目文件AssemblyInfo.cs刪除掉後,在相應的刪除文件竟然沒刪除,不過,我把它手工刪除掉,OK,一切正常,還是感謝告訴我怎麽樣改項目的Assembly name的朋友,不然我竟然找好久也不曉得怎麽生成帶上命名空間的dll。

項目DALFactory是采用工廠模式設計的,設計模式的書我也曾看過Java的設計模式,理解也不太深刻,但對工廠模式還是較爲熟悉,使用它可以根據需求返回不同的實例對象,在DALFactory項目中使用反射機制來實現依賴注入,當然,它的實現還是沒有java中的spring那樣靈活,強大,部分代碼如下: // <summary> /// 抽象工廠模式創建DAL。 /// Web.config 需要加入配置:(利用工廠模式+反射機制+緩存機制,實現動態創建不同的數據層對象接口) /// DataCache類在導出代碼的文件夾裏 /// 可以把所有DAL類的創建放在這個DataAccess類裏 /// <appSettings> /// <add key="DAL" value="SmsSystem.SQLServerDAL" /> (這裏的命名空間根據實際情況更改爲自己項目的命名空間) /// </appSettings> /// </summary> public sealed class DataAccess { private static readonly string path = ConfigurationManager.AppSettings["DAL"]; /// <summary> /// 創建對象或從緩存獲取 /// </summary> public static object CreateObject(string path, string CacheKey) {  object objType = DataCache.GetCache(CacheKey);//從緩存讀取  if (objType == null)  {   try   {    //Assembly ass = new Assembly();    objType = Assembly.Load(path).CreateInstance(CacheKey);//反射創建    DataCache.SetCache(CacheKey, objType);// 寫入緩存   }   catch(System.Exception ex)   {    string str = ex.Message;//    SmsSystem.Utility.SaveLog.SaveInfoToLog(str, "errorLog", "異常");   }  }  return objType; } /// <summary> /// 不使用緩存,創建對象 /// </summary> private static object CreateObjectNoCache(string path, string CacheKey) {  try  {   object objType = Assembly.Load(path).CreateInstance(CacheKey);   return objType;  }  catch//(System.Exception ex)  {   //string str=ex.Message;// 記錄錯誤日志   return null;  } } /// <summary> /// 創建CustEmployee數據層接口 /// </summary> public static SmsSystem.IDAL.ICustEmployee CreateCustEmployee() {  string CacheKey = path + ".CustEmployee";  object objType = CreateObject(path, CacheKey);  return (ICustEmployee)objType; } ………………(其它數據層接口) }   由這一個類,就可以獲取需要用的數據訪問層的實例,可是,我在使用過程中卻總是抛出異常,[System.IO.FileNotFoundException] = {"未能加載文件或程序集「SmsSystem.SQLServerDAL」或它的某一個依賴項。系統找不到指定的文件。":"SmsSystem.SQLServerDAL"} ,說實話,對于C#這排錯和調試我還手生,我百思不得其解,爲什麽會一用反射就異常呢,整個上去我去看反射的IPA,感覺我的用法沒錯誤啊,況且,我看PetShop的例子就是這樣差不多的寫法,它爲什麽能用,下午調試了好久還是在出錯,我發狠心去和petShop去對比,後來終于發現,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll這樣的名字,而我的就是個SQLServerDAL.dll,我感覺極有可能是這裏有問題,因爲在wb.config裏我配置過 <appSettings> <add key="DAL" value="SmsSystem.SQLServerDAL"/> ………… </appSettings>   這樣一個程序集,搞了好久,請教別人,結果弄清楚,是要項目的屬性裏設置程序集的名稱,就可以生成SmsSystem.SQLServerDAL.dll這樣的dll文件 [url=/bbs/detail_571362.html][img]http://images.wangchao.net.cn/images/upload/images/1166261350609.jpg[/img][/url] 設置,重新生成 ,又出了一點問題,   類型「SmsSystem.BLL.CustEmployee」同時存在于「c:\Windows\Microsoft.net\Framework\v2.0.50727\Temporary ASP.NET Files \smssystem\3358d7f2\16ba9bb7\assembly\dl3\7296d5df\40ded961_96d8c601\BLL.DLL」 和「c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\smssystem\3358d7f2 \16ba9bb7\assembly\dl3\644d894c\4cf8840a_9ad8c601\SmsSystem.BLL.DLL」 中 G:\ASP.NET\SmsSystem\Default.aspx.cs 22   我仔細一看,原來在web項目的bin下面,原來的SQLServerDAL.dll還在,又多了個SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一個沒有自動刪除掉的多余文件,昨天是一個項目文件AssemblyInfo.cs刪除掉後,在相應的刪除文件竟然沒刪除,不過,我把它手工刪除掉,OK,一切正常,還是感謝告訴我怎麽樣改項目的Assembly name的朋友,不然我竟然找好久也不曉得怎麽生成帶上命名空間的dll。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有