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

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

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


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

最佳答案

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

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


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


如果需要重新启动之间的稳定性,而不是重新构建之间的稳定性,则可以使用RegistrationBuilder根据类型名称分配ID。

当然,此时,仅在MEF 2的CodePlex预览版本或.NET 4.5 Developer Preview中可用。

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

关于c# - 如何识别MEF中的零件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8364001/

10-13 06:05