自己在使用抽象工廠+配置檔案+反射實作重構機房的過程中,遇到了這種情況,

當初自己認真的檢查了反射中的代碼,都是沒有問題,請教了師姐,檢查了抽象工廠與反射的使用都沒有問題
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語句有些不同吧?!