我有一個使用MEF加載部件的系統。每個部分都依賴於核心庫。當我生成項目,我添加了一個版本號這樣的.dll文件:MEF相關性和版本號
- part1-1.0.0.0.dll
- part2-1.0.0.0.dll
而且,有一個應用程序執行MEF組合。它也使用核心庫。我發現我可以部署「part」dll,並且組合工作良好,因爲應用程序已經加載了部件依賴的核心庫。所以,我的文件系統看起來是這樣的:
- /parts/part1-v1.dll
- /parts/part2-v1.dll
- 作曲家v1.exe
- 核心v1.exe
我遇到的麻煩是如何處理核心和部件的版本控制。假設我對核心和其中一個部分進行了更新。然後,我部署這些更改。所以,現在我的文件系統可能看起來像:
- /parts/part1-v1.dll
- /parts/part1-v2.dll
- /parts/part2-v1.dll
- 作曲家-v1.exe
- 核心v1.dll
- 核心v2.dll
我怎樣才能確保第一部分 - v1.dll採用核心v1.dll,和第1部分,v2.d會使用core-v2.dll?我需要加載所有版本的部件並使用適當版本的內核。
的部分類是這個樣子:
[Export(typeof(IPart))]
public class Part1
{
public string GetSomethingFromCore()
{
return Core.GetSomethingFromCore();
}
}
[Export(typeof(IPart))]
public class Part2
{
public string GetSomethingFromCore()
{
return Core.GetSomethingFromCore();
}
}
我會回來這種做法。注意Wim如何將接口的'Core'功能抽象出來,這一點尤其重要,因爲在Lance給出的例子中,他似乎靜態引用'Core',Part1和Part2實際上會引用不同的靜態單例,這通常不會是預期的行爲。 通過抽象接口的功能,'核心'參數實際上可以是singleton _instances _,同一個對象,它通過兩個不同版本的接口(ICorev1和ICorev2)發佈功能。 – Adam
查看所有Microsoft Office互操作程序集,並注意它們如何具有v8,v9,v10 dll等(在命名空間中具有版本)。每個新版本_does_not_都重新定義了最後一個功能,但只是_adds_。所以,從維護的角度來看,你的 '核心' 的實施將(一段時間內)看起來像這樣(僞): 內部類核心:ICorev1,ICorev2 { ICorev1.GetSomethingFromCore() {} ICorev2.GetSomethingFromCore2( ) {} } – Adam