仿PetShop,C#反射機制爲題解答

 

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

using System;
using System.Reflection;
using System.Configuration;
using PetStore.IDAL;
namespace PetStore.DALFactory
{
    
/// <summary>
    
/// 抽象工廠模式創建DAL。
    
/// web.config 需要加入配置:(利用工廠模式+反射機制+緩存機制,實現動態創建不同的數據層對象接口)  
    
/// DataCache類在導出代碼的文件夾裏
    
/// 可以把所有DAL類的創建放在這個DataAccess類裏
    
/// <appSettings>  
    
/// <add key="WebDAL" value="PetStore.SQLServerDAL" /> (根據實際情況更改爲自己項目的命名空間)
    
/// </appSettings> 
    
/// </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>
        
/// 創建Account數據層接口
        
/// </summary>
        public static PetStore.IDAL.IAccount CreateAccount()
        {
            
string CacheKey = path+".Account";
            
object objType=CreateObject(path,CacheKey);
            
return (IAccount)objType;
        }
    }
}

也可以不使用緩存,都是一樣的效果。當然使用緩存優點是不用說的了.....

//不使用Cache
public static PetStore.IDAL.IAccount Create() {                
     
string className = path + ".Account";

     
// Using the evidence given in the config file load the appropriate assembly and class
     return (PetStore.IDAL.IAccount)Assembly.Load(path).CreateInstance(className);
}

  由這一個類,就可以獲取需要用的數據訪問層的實例,可是,我在使用過程中卻總是拋出異常,[System.IO.FileNotFoundException] = ,說實話,對於C#這排錯和調試我還手生,我百思不得其解,爲什麼會一用反射就異常呢,整個上去我去看反射的IPA,感覺我的用法沒錯誤啊,況且,我看PetShop的例子就是這樣差不多的寫法,它爲什麼能用,下午調試了好久還是在出錯,後來有幸查到開發者在線 Builder.com.cn作者cleverfoxloving的一篇Blog,經研究終於發現,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll這樣的名字,而我的就是個SQLServerDAL.dll,我感覺極有可能是這裏有問題,因爲在wb.config裏我配置過

<appSettings>
    
<add key="WebDAL" value="PetStore.SQLServerDAL" />
    
<add key="SQLConnString1" value="server=.;database=MSPetShop;uid=sa;pwd=sa;" />
 
</appSettings>

看到Blog上的知道是因爲是要項目的屬性裏設置程序集的名稱,就可以生成PetStore.SQLServerDAL.dll這樣的dll文件:

  類型“PetStore.BLL.Account”同時存在於“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files
smssystem58d7f2ba9bb7assemblydl396d5dfded961_96d8c601BLL.DLL”
和“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filessmssystem58d7f2
ba9bb7assemblydl34d894ccf8840a_9ad8c601SmsSystem.BLL.DLL”中
  原來在web項目的bin下面,原來的SQLServerDAL.dll還在,又多了個PetStore.SQLServerDAL.dll,哈哈,vs2005/vs2005 都又一個沒有自動刪除掉的多餘文件的B,,不過,我把它手工刪除掉,OK,一切正常,還是感謝這篇Blog,不然我好久也不曉得怎麼生成帶上命名空間的dll。

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