2011-02-10 27 views
11

我有一個使用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(); 
    } 
} 

回答

5

strong naming把你的問題的關心?如果一個程序集是針對一個強命名的依賴關係構建的,那麼你知道它只接受到最後一個字節的完全相同的依賴關係。

或者,如果強命名過於嚴格,則可以將版本號置於類型名稱中。例如:

[Export(typeof(IPart))] 
public class Part1v1 
{ 
    private readonly ICorev1 core; 

    [ImportingConstructor] 
    public Part1v1(ICorev1 core) 
    { 
     this.core = core; 
    } 
} 

[Export(typeof(IPart))] 
public class Part1v2 
{ 
    private readonly ICorev2 core; 

    [ImportingConstructor] 
    public Part1v2(ICorev2 core) 
    { 
     this.core = core; 
    } 
} 
+3

我會回來這種做法。注意Wim如何將接口的'Core'功能抽象出來,這一點尤其重要,因爲在Lance給出的例子中,他似乎靜態引用'Core',Part1和Part2實際上會引用不同的靜態單例,這通常不會是預期的行爲。 通過抽象接口的功能,'核心'參數實際上可以是singleton _instances _,同一個對象,它通過兩個不同版本的接口(ICorev1和ICorev2)發佈功能。 – Adam

+0

查看所有Microsoft Office互操作程序集,並注意它們如何具有v8,v9,v10 dll等(在命名空間中具有版本)。每個新版本_does_not_都重新定義了最後一個功能,但只是_adds_。所以,從維護的角度來看,你的 '核心' 的實施將(一段時間內)看起來像這樣(僞): 內部類核心:ICorev1,ICorev2 { ICorev1.GetSomethingFromCore() {} ICorev2.GetSomethingFromCore2( ) {} } – Adam

1

你需要給你的核心組件,所有的零件strong names的,那麼他們將在加載引用的程序集時要求完全匹配。這也意味着您將需要部署核心程序集的多個副本。即代替

  • /parts/part1-v1.dll
  • /parts/part1-v2.dll
  • /parts/part2-v1.dll
  • 作曲家-v1.exe
  • 芯-V1。dll的
  • 核心v2.dll

您將有:

  • /parts/1-1/part1-v1.dll
  • /零件/ 1-1 /核心-V1 .DLL
  • /parts/1-2/part1-v2.dll
  • /parts/1-2/core-v2.dll
  • /parts/2-1/part2-v1.dll
  • /parts/2-1/core-v1.dll
  • 作曲家v1.exe
  • 核心v1.dll
  • 核心v2.dll

我做這件事的方法在過去,只是將每個部分存儲在一個單獨的文件夾中以及所需的所有依賴關係中。即使它們(當前)與應用程序中的版本相同。所以當你的應用程序移動到core-v2時,所有依賴於core-v1的部分仍然會擁有它。