如何在MEF中识别零件

本文关键字:零件 识别 MEF | 更新日期: 2023-09-27 18:16:26

问题就是这么简单:在实际创建部件之前,我需要某种方法来识别可组合部件的定义。

换句话说,我需要能够将标识部件的字符串发送到某个远程站点,该站点稍后会将字符串发送回给我,并且我应该能够根据字符串选择相同的部件。我不一定需要一个字符串(我可以创建自己的map),但我需要一个唯一的和相等可比的东西。

一些我想过但拒绝的事情:

  1. 我确实意识到这样做的"正确"方法是用元数据装饰我的部分,但我不想这样做。首先,使用有意义的字符串作为标识符意味着有重复的风险,而使用随机字符串(如GUID)意味着它会很难看。其次,我的插件很多,我不想总是记得要装饰它们。
  2. 另一种立即跳入脑海的方法是使用部件的类型。然而,MEF是通用的,足以超越这种形式:一个部分不一定是一个。net类。
  3. 在尝试"修复"前一点时,我可以使用当我去创建零件时返回的实际对象的类型,但随后我将不得不创建所有零件,这是无数的。

如何在MEF中识别零件

元数据确实是唯一可行的选择,特别是如果您希望标识符随时间保持稳定,例如面对应用程序重启或实现类重构/重命名。

如果您不需要应用程序重启之间的稳定性,您可以:

  • 使用mef2的RegistrationBuilder以编程方式生成必要的元数据值,例如基于递增的整数;或者,
  • 创建一个自定义的[MetadataAttribute],它做大致相同的事情来在运行时生成id值

如果您需要重启之间的稳定性,而不是重建之间的稳定性,那么使用RegistrationBuilder根据类型名称分配id是一个选项。

当然,RegistrationBuilder目前只在CodePlex预览版的MEF 2或。net 4.5开发者预览版中可用。

TLDR;手动应用元数据属性是最好的选择。在调试模式下,你可以在应用程序中编写一个初始化后的例程来确保唯一性/存在性。