MEF如何确定其import顺序?

MEF允许您通过使用ImportMany属性导入多个部件。 它如何确定检索相关导出的顺序并将它们添加到您正在填充的可枚举中? 例如,如何导入必须按特定顺序触发的多个IRules? 我能想到的唯一方法是在IRule中使用OrderValue属性并手动排序:

 public class Engine { [ImportMany] public IEnumerable Rules { get; set; } public void Run() { // ... // Initialise MEF // ... // // Do I need to manually order Rules here? // foreach (IRule rule in Rules) { // Must execute in a specific order rule.Execute(); } } } 

默认情况下,MEF不保证导入的导出的任何顺序。 但是在MEF中,您可以使用一些元数据和自定义集合进行一些排序。 例如,您可以执行以下操作:

 public interface IRule { } [Export(typeof(IRule))] [ExportMetadata("Order", 1)] public class Rule1 : IRule { } [Export(typeof(IRule))] [ExportMetadata("Order", 2)] public class Rule2 : IRule { } public interface IOrderMetadata { [DefaultValue(Int32.MaxValue)] int Order { get; } } public class Engine { public Engine() { Rules = new OrderingCollection( lazyRule => lazyRule.Metadata.Order); } [ImportMany] public OrderingCollection Rules { get; set; } } 

然后,您将拥有一组按元数据排序的规则。 您可以在http://codepaste.net/ktdgoh找到OrderingCollection示例。

在MEF中实现此排序的最佳方式是利用我们的元数据设施。 您可以将自己的元数据附加到可用于排序和过滤的导出。 元数据还允许您延迟部件的实例化,直到实际需要它们为止。 此外,您可以创建自定义导出属性,这些属性提供了一种提供元数据的简洁方法。

有关如何定义元数据和自定义导出的信息,请查看此链接: 链接文本

您也可以在我们的MEF论坛上找到这个主题。 在其中您将找到有关AdaptingCollection方法的讨论,该方法允许您使用应用元数据filter/订单的自定义集合。

HTH Glenn

您可以让规则按顺序相互导入(使用Decorator模式),但是每个规则都需要知道它之前的特定规则,这可能不是您想要的。

MEF可以帮助您发现零件,您之后使用它们取决于您。 如果你想对零件进行分类然后继续,那就没有错!