C# 如何在MEF中识别零件?

C# 如何在MEF中识别零件?,c#,.net,mef,C#,.net,Mef,问题就这么简单:在实际创建零件之前,我需要某种方法来识别可组合零件定义 换句话说,我需要能够向某个远程站点发送一个标识该部件的字符串,该站点稍后会将该字符串发送回我,并且我应该能够根据该字符串选择相同的部件。我不一定需要字符串(我可以构建我自己的地图),但我需要一些独特且平等的东西 有些事情我想了想,却拒绝了: 我确实意识到这样做的“正确”方式是用元数据装饰我的部件,但我不想这样做。首先,使用一个有意义的字符串作为标识符意味着重复的风险,而使用一个随机字符串(比如GUID)意味着它会很难看。第二

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

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

有些事情我想了想,却拒绝了:

  • 我确实意识到这样做的“正确”方式是用元数据装饰我的部件,但我不想这样做。首先,使用一个有意义的字符串作为标识符意味着重复的风险,而使用一个随机字符串(比如GUID)意味着它会很难看。第二,我的插件很多,我不想一直记着装饰它们
  • 另一种立即想到的方法是使用零件的类型。然而,MEF的通用性足以超越这种形式:部件不一定是.NET类
  • 在尝试“修复”前一点时,我可以使用在创建部件时返回的实际对象的类型,但随后我必须创建所有部件,这些部件数量众多

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

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

    • 使用MEF 2的
      RegistrationBuilder
      以编程方式生成必要的元数据值,例如基于递增整数;或者
    • 创建一个自定义的
      [MetadataAttribute]
      ,它在运行时生成id值的操作大致相同
    如果在重新启动之间需要稳定性,但在重建之间不需要稳定性,则可以使用
    RegistrationBuilder
    根据类型名称分配ID

    当然,
    RegistrationBuilder
    目前仅在MEF 2的CodePlex预览版或.NET 4.5开发者预览版中可用


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

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

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

    • 使用MEF 2的
      RegistrationBuilder
      以编程方式生成必要的元数据值,例如基于递增整数;或者
    • 创建一个自定义的
      [MetadataAttribute]
      ,它在运行时生成id值的操作大致相同
    如果在重新启动之间需要稳定性,但在重建之间不需要稳定性,则可以使用
    RegistrationBuilder
    根据类型名称分配ID

    当然,
    RegistrationBuilder
    目前仅在MEF 2的CodePlex预览版或.NET 4.5开发者预览版中可用


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

    在命名任何内容时,使用有意义的字符串可能会导致重复。这就是为什么会有名称空间。将名称空间应用于编程语言,如C#,我会进行编译器检查。编译器会告诉我是否存在冲突。然而,在没有这种检查的情况下,复制正是发生的事情。使用“”作为命名空间,您看到了多少web服务?但与web服务不同的是,我的环境实际上需要唯一性。有包含部分的目录,必要的部分在合成过程中被实例化。因此,仅仅因为一个部件是“创建的”,并不意味着它是实例化的(如果有帮助)。@jberger:我想识别部件定义,而不是部件。@FyodorSoikin:有属性来获取它们的定义(和)。在命名任何东西时,使用有意义的字符串有重复的风险。这就是为什么会有名称空间。将名称空间应用于编程语言,如C#,我会进行编译器检查。编译器会告诉我是否存在冲突。然而,在没有这种检查的情况下,复制正是发生的事情。使用“”作为命名空间,您看到了多少web服务?但与web服务不同的是,我的环境实际上需要唯一性。有包含部分的目录,必要的部分在合成过程中被实例化。因此,仅仅因为一个部件是“创建的”,并不意味着它是实例化的(如果有帮助)。@jberger:我想识别部件定义,而不是部件。@FyodorSoikin:有属性来获取它们的定义(和)。我对元数据的主要关注是,我不想给插件开发人员带来负担。相信我,有一些强有力的理由:-)看看RegistrationBuilder。这看起来正是我现在需要的。对于其他一些需要生成元数据的场景,它也很方便。谢谢我主要关心的是元数据,我不想给插件开发人员带来负担。相信我,有一些强有力的理由:-)看看RegistrationBuilder。这看起来正是我现在需要的。对于其他一些需要生成元数据的场景,它也很方便。谢谢