有和没有合同名称的MEF出口是否存在缺点?

时间:2013-04-11 13:39:05

标签: c# mef

我正在寻找适合一组导出的测试处理程序,以便一些可以自动使用而无需人工交互,有些可以手动使用。当它们具有手动功能时,它们将显示不同的用户控件。

我知道您可以使用合同名称导出/导入,但我想知道使用它的缺点是什么:

[Export(typeof(TestStepHandler))]
[Export("ManualTest", typeof(TestStepHandler))]

这样我可以在与手动测试相关联的一个ViewModel中导入合同名称,并在其他地方导入另一个ViewModel中的所有内容。我猜我仍然需要手动测试的属性,以便在用户模式下显示时,'DataTemplate`的工作方式不同,但这很容易迭代导入的列表。

我确实认为我可以使用元数据和Lazy导入和过滤,但是在使用和不使用合同名称的情况下提供的优势是什么?

1 个答案:

答案 0 :(得分:2)

导出元数据优于导出合同的一个优点是,通过元数据,您可以动态地更改导出对象的过滤。属性是静态的。

您所描述的另一个缺点是您在测试代码中添加了与测试相关的代码。我不知道你真正想要的是什么。

来自使用您提及的导出元数据的解决方案的公寓还有另一种方法来替换属性模型合同:

使用MEF2的约定功能,允许设置不带属性的导出/导入。如果您不熟悉MEF2约定,请查看此series of mini articles。惯例的好处在于它不能替代归因模型。两者都可以一起工作。这意味着您可以在程序集上使用MEF属性,并在测试中使用约定来添加合同。这种方法的重点是允许测试注入将用于创建目录的RegistrationBuilder