根據設計模式的原則:1.針對介面編程,而不是針對實現編程。2.優先使用對象組合,而不是類繼承。3.封裝變化點。
根據上面三個主要的原則,我們我可通過封裝變化來減少代碼的改動。(通過設定檔來封裝變化)。
但是當我們更改設定檔的時候就需要重新載入就會引起重新啟動應用程式。為了能夠在運行時動態修改設定檔後而不需要重新啟動且能立即生效的話,我們就可以用外掛程式來實現。然而是針對.net而言,我們可以把載入的外掛程式放到不同的AppDomain中去,這樣就可以防止當外掛程式配置發生更改的時候而不需要重新啟動就能使整個應用程式重新生效。
所以:我們需要把具體的目錄放到增益集集,我們可以用Assembly.Load()通常運行良好,但是程式集無法獨立卸載(只有Appdomain可以),這意味著如果你正在編寫伺服器,而且你希望使用者無需啟動和定製伺服器即更新他們的增益集。那麼你將無法使用預設的Appdomain實現此任務。要實現此功能,我們加在一個獨立的Appdomain中載入所有增益集集。當添加或修改檔案時,我們將卸載Appdomain,建立新的Appdomain,然後將當前檔案載入到其中。
根據這個思想,可以考慮以下解決方案:
我們看看外掛程式的配置:
<configuration>
<Assemblies>
<PluginAssembly AssemblyName="TestXML.exe" AssemblyPath="D:\Downloads\AssemblyLoader\TestXML\bin\Debug\">
<Formats>
<FormatAdapter TypeName="TestXML.Program" RouterTypeName="GetData" />
<FormatAdapter TypeName="TestXML.Program" RouterTypeName="GetName" />
</Formats>
</PluginAssembly>
<PluginAssembly AssemblyName="LibTest.dll" AssemblyPath="D:\Downloads\AssemblyLoader\LibTest\bin\Debug\">
<Formats>
<FormatAdapter TypeName="LibTest.Class1" RouterTypeName="GetData" />
<FormatAdapter TypeName="LibTest.Class1" RouterTypeName="GetData" />
</Formats>
</PluginAssembly>
</Assemblies>
</configuration>
上面的設定檔是外掛程式的配置:(當然可以進行擴充)
下面簡單介紹下配置的大體意思:
PluginAssembly節點表示一個外掛程式:
AssemblyName:外掛程式的名稱(也就是.exe或.dll)
AssemblyPath:外掛程式配置的路徑(AssemblyName所在檔案的路徑)
Formats:需要在AssemblyName檔案中調用的資訊
TypeName:指的是AssemblyName的類型定義。
RouterTypeName:指TypeName中方法的定義。
所有上面的設定檔就代表應用程式執行的順序是這樣的:
1.(TextXML.exe)TextXML.Program類中的GetData方法.
2.(TextXML.exe)TextXML.Program類中的GetName方法
3.(LibTest.dll)LibText.Class1類中的GetData方法(因配置一樣,所以這個方法將調用兩次)
Charles Chen