自己在使用抽象工廠+設定檔+反射實現重構機房的過程中,遇到了這種情況,
當初自己認真的檢查了反射中的代碼,都是沒有問題,請教了師姐,檢查了抽象工廠與反射的使用都沒有問題
Private Shared ReadOnly AssemblyName As String = "DAL" '資料程式集名稱 Private Shared ReadOnly db As String = System.Configuration.ConfigurationSettings.AppSettings("DB") Public Function CreateUser() As [Interface].IUser Dim ClassName As String = "DAL" + "." + db + "User" Dim User As IUser '定義介面 '反射執行個體化() User = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IUser) Return User
後來在網上找到了類似的問題的解決方案解決了,提示很明顯是缺少DLL,原因:
1:DLL檔案名稱與載入時的DLL檔案名稱不一致。
2:.DLL檔案根本不存在,即出現丟失情況。
3.:載入DLL路徑錯誤,即DLL檔案存在,但載入路徑不正確
我查了自己項目的情況:
檔案名稱一致,在UI層沒有尋找到產生的關於D層的Dll檔案,程式啟動並執行機制是在啟動層的bin檔案夾下的debug裡面必須得有別的程式集產生的dll檔案,程式在運行時會直接在啟動的這一層裡面直接的調用所需要的dll檔案,後來自己把有關的D層產生的dll手動添加了進去,在運行,沒有錯誤了;但是這樣還是不行的畢竟後期還需要做大量的工作,總不能每次都需要手動吧,後來才知道原來可以調整程式的產生路徑:
這樣對於這個問題就解決掉了,學習到很多知識:
反射的一個原則:一切皆以UI層的bin檔案夾中的dll名稱為中心。(原因很簡單:.net類載入的機制就是預設從本程式集的bin檔案中找,所以bin檔案夾中一定要有要載入的程式集的dll)。UI層中bin檔案夾中dll叫什麼名字AssemblyPath就使用什麼名字,bin內部類的全名叫什麼,className就寫成什麼全名。.net中的引用:加入對某個程式集的引用就能在程式集有變化時自動拷貝dll。
發現問題:自己搜尋的時候還是有些偏差,今後多多鍛煉。
總結:遇見問題是很正常的,是自己不斷前進的階梯,踏踏實實的解決問題才是最重要的
後期對反射的思考與學習:
雖然抽象原廠模式是為解決資料庫更換而設計的,但操作不同資料庫到底有些什麼不同目前尚不十分清楚,除了連結字串上有區別,還知道Sql Server和Access等在ADO.NET上的使用是不同的,Sql Server用的是System.Data.SqlClient命名空間下的SqlConnection、SqlCommand、SqlParameter、SqlDataAdapter、SqlDataReader等,而Accesss資料庫則是用的System.Data.OleDb命名空間下相應的類。此外可能對不同資料庫進行操作時SQL語句有些不同吧?!
對現在正在設計的機房收費系統,如果不同資料庫之間的SQL語句沒區別,那麼現在所寫的繼承資料表處理介面的資料表處理類就不必在更換資料庫時被替換。也就是反射的應用就沒有必要了,因為反射在這的作用就是動態產生資料庫處理類(根據條件產生處理Sql Server或其他資料庫的處理類,而這些資料庫處理類用的就是SQL語句)。 對這個模式應用的整體感覺是試著應用上了模式來解決資料庫更換帶來的問題,但究竟解決了沒有,解決徹底否尚有很大疑問……