MEFを使用して部品をロードするシステムがあります。これらの各部分は、コアライブラリに依存しています。また、MEF依存関係とバージョン管理
- part1-1.0.0.0.dll part2-1.0.0.0.dll
:私はプロジェクトをビルドするとき、私はこのような.dllファイルにバージョン番号を追加しますMEF合成を行うアプリケーションがあります。また、コアライブラリも使用します。私は、 "part" dllを配備するだけで済み、コンポーネントが依存しているコアライブラリを既にアプリケーションにロードしているため、コンポジションはうまくいきます。
- /parts/part1-v1.dll
- /parts/part2-v1.dll
- 作曲-v1.exe
- コア-v1.exe:だから、私のファイルシステムには、次のようになります
私が抱えている問題は、コアと部品のバージョン管理の仕方です。コアとその部分の1つを更新したとします。次に、変更を展開します。
- /parts/part1-v1.dll
- /parts/part1-v2.dll
- /parts/part2-v1.dll
- 作曲:だから今、私のファイルシステムは、次のようになります-v1.exe
- コア - v1.dll
- コア-v2.dll私はパート1-v1.dllはコアv1.dll、およびpart1を-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();
}
}
私はこのアプローチを取り戻すだろう。 Lanceが与えた例では、「コア」を静的に参照するように見えるため、Part1とPart2は実際には異なるスタティックシングルトンを参照するため、Wimは「コア」機能をインターフェイスに抽象化しています。予想される行動。 インターフェイスに機能を抽象化することによって、 'コア'引数は実際には異なるオブジェクト(ICorev1とICorev2)の2つの異なるバージョンを介して機能を公開する同じオブジェクトsingleton _instances_です。 – Adam
すべてのMicrosoft Office相互運用機能アセンブリを見て、v8、v9、v10のdllなど(名前空間のバージョンを持つ)の仕組みに注意してください。それぞれの新しいバージョン_does_not_は、最後から機能を再定義しますが、_adds_に追加します。 内部クラスのコア::ICorev1、ICorev2 { ICorev1.GetSomethingFromCore(){} ICorev2.GetSomethingFromCore2(だから、メンテナンスの観点から、あなたの 'コア' の実装は、(時間をかけて)この(擬似コード)のようになります。 {{ }} – Adam