2008-11-17 123 views
0

在我們的處理軟件中,我們正在從一個外部程序集版本轉移到新版本。儘管程序集執行的總體任務是相同的,但API卻有很大不同,並且沒有向後兼容性。該API負責從外部站點提取數據,這些站點可能使用匹配的新API或舊API運行(也沒有向後兼容性)。我們無法控制外部組件或外部站的軟件。外部程序集未被強烈簽名,並且程序集中的模塊對於兩個版本都具有相同的名稱。使用版本化的.Net程序集

我們不希望維護兩個版本的處理軟件,而是動態演變,並使用舊版本或外部裝配的新版本(取決於外部站點的聯繫)。我們可以確定外部站是否支持新版本,因此「版本」的選擇可以更多或更少。

所以設置是我們有兩個版本的外部程序集ComLib.dll。我們可以參考相同組件/項目中的兩個版本,以及在確定類型時如何區分兩個組件?

假設上述內容不能在單個程序集/項目中完成,我們可以實現特定於版本的「適配器」程序集,每個版本的外部程序集都有一個程序集(我認爲我們已經有足夠的接口和抽象這個),但有一些警告我們應該尋找或一些特定的設置,以避免運行時類型/版本混淆(程序集解析/加載等)?在.NET運行時中是否存在足夠的「並行」支持?

更新:爲了使事情更有趣,增加了對這個問題的進一步轉換。似乎外部程序集會加載其他程序集並使用外部配置文件。由於不同版本需要不同的配置文件和不同的附加程序集,因此每個版本都需要以某種方式加載與其版本匹配的附加程序集。

對我來說似乎是我們想要的是每個版本的程序集都要在包含其配置文件和附加程序集的單獨文件夾中加載一個「根」。這甚至可以使用標準的程序集解析器/加載器,或者我們必須手動執行一些魔術,並且可能會手動加載程序集(在單獨的AppDomains中)以強制執行「根」文件夾?

回答

0

你說這段代碼是用來和外部站通信的。爲什麼不從與外部通信站通信的代碼中提供服務?該服務將從您當前的程序中調用。

這將允許您運行服務的兩個版本 - 一個用於舊API,另一個用於新版本。每個服務都在它自己的進程中(或者可能是AppDomain),因此可以加載它喜歡的程序集版本。在主站程序從一個站點切換到另一個站點的過程中,隨着API版本更改,您將從一個服務切換到另一個服務。

這樣做會帶來額外的好處,可以將您與外部供應商隔離,從而創建一個第三個 API版本,該版本不與前兩個版本向後兼容。

此解決方案的性能可能相當高,因爲您的主程序可以通過命名管道與服務進行通信,甚至可以在內存中傳輸。 WCF可以在傳輸(綁定)之間進行切換,大多數情況下不會更改代碼。

相關問題