繁体   English   中英

如何识别MEF中的零件?

[英]How to identify parts in MEF?

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

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

我想到并拒绝的一些事情:

  1. 我确实意识到执行此操作的“正确”方法是用元数据装饰我的零件,但我不想这样做。 首先,使用有意义的字符串作为标识符意味着存在重复的风险,而使用随机的字符串(如GUID)则意味着很丑陋。 其次,我的插件很多,我不想一直记住要装饰它们。
  2. 立即想到的另一种方法是使用零件的类型。 但是,MEF具有足够的通用性,可以胜过此类形式:一部分不一定是.NET类。
  3. 在尝试“修复”上一点时,我可以使用创建零件时返回的实际对象的类型,但是随后我必须创建所有零件,其中有很多。

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

如果在两次应用程序重启之间不需要稳定性,则可以执行以下任一操作:

  • 使用MEF 2的RegistrationBuilder以编程方式生成必要的元数据值,例如基于递增的整数; 要么,
  • 创建一个自定义[MetadataAttribute] ,该自定义[MetadataAttribute]在运行时执行大致相同的操作以生成id值

如果需要在两次重启之间保持稳定,而在两次重建之间则不需要,那么可以选择使用RegistrationBuilder根据类型名称分配ID。

当然,此时,只能在MEF 2的CodePlex预览版本或.NET 4.5 Developer Preview中使用RegistrationBuilder

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM