【问题标题】:.NET MEF: part versioning.NET MEF:部分版本控制
【发布时间】:2015-06-25 09:03:34
【问题描述】:

我正在探索在 .NET 4.0 中引入的 MEF,但我在官方文档或任何其他网站上都没有找到管理版本控制的真正方法。

我发现了这个问题MEF Dependencies and versioning,但答案并不令人满意:在我看来,强大的命名核心和插件过于耦合。

我的例子:

  • A 部分导入接口 ICar(1.0 版)
  • B部分导出接口ICar

一切都很顺利。 发布后,我决定修改 ICar 以提供具有更复杂 ICar 接口的 1.1 版。显然 B 部分不能再加载了。 这里的最佳实践如何?显然正确的做法是不改变接口ICar。但改变 ICar 是不是最好的方法? 在博客上,我发现您需要:

  • 创建 ICar2 而不是更改 ICar
  • 为 ICar 创建(手动)适配器
  • 同时导入 ICar2 和 ICar,后者需要使用适配器适应 ICar2。

似乎 System.Addin (MAF) 使用内置解决方案管理此场景。

到目前为止有什么想法吗?

顺便说一句,MEF 似乎是一个真正的好技术,但官方文档还不够(像往常一样微软......)

【问题讨论】:

    标签: .net .net-4.0 assemblies mef .net-assembly


    【解决方案1】:

    您可以在此处使用接口隔离来尝试简化此操作。在您的示例中,您有 ICart,因此对于新功能,您可以使用新属性/方法创建一个新接口 ICarExtra(如果您希望这可以实现原始 ICar 接口)

    所以现在您的 PartB 仍然可以满足任何 ICart 的导入,但您可以拥有一个更新的 PartC,它具有可以满足 ICartExtra 导入的附加功能。

    或者,对于更复杂的解决方案,您可以创建自己的 CompositionContainer 版本并使用一些自定义功能覆盖 ComposeParts 方法,以做出更明智的决定。

    【讨论】:

    • 感谢您的建议。我目前正在使用接口隔离来添加概念上不同的功能(ITyre、IWheel 等)。我不确定这是不是扩展 ICar 的最佳方法,但可能比创建适配器更好。在我看来,您建议的另一种方式似乎更放弃 MEF 并实施您的零件加载器,这可能是管理事物的好方法。
    • 它并没有真正放弃 MEF,而是增强了它 :) 我想我有一个例子,如果你有兴趣更详细地了解这个想法,我稍后会放在 github 上。我使用了一个自定义 CompositionContainer 来决定使用什么实现。例如,您可以使用某个全局变量的值来让代码更改为更详细的记录器,而无需重新启动应用程序。
    猜你喜欢
    • 2013-02-10
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多