我有一个使用 MEF 加载零件的系统。这些部分中的每一个都依赖于一个核心库。当我构建项目时,我将版本号添加到 .dll 文件中,如下所示:
- 第1部分-1.0.0.0.dll
- 第2部分-1.0.0.0.dll
此外,还有一个执行 MEF 合成的应用程序。它还使用核心库。我发现我可以只部署“部分”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
- core-v1.dll
- core-v2.dll
如何确保part1-v1.dll使用core-v1.dll,而part1-v2.dll使用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();
}
}
Doesn't 强命名 http://msdn.microsoft.com/en-us/library/wd40t7ad.aspx解决你的问题了吗?如果程序集是针对强命名依赖项构建的,那么您知道它只会接受直到最后一个字节的完全相同的依赖项。
或者,如果强命名过于严格,您可以将版本号放在类型名称中。例如:
[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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)