2009-11-20 60 views
19

MEF允许您通过使用ImportMany属性导入多个零件。它如何确定它检索相关输出的顺序,并将它们添加到您正在填充的可枚举项中?例如,我将如何导入需要按特定顺序触发的多个IRule?我能想到的唯一的办法就是在iRule中的OrderValue财产和手动排序:MEF如何确定进口订单?

public class Engine 
{ 
    [ImportMany] 
    public IEnumerable<IRule> 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(); 
    } 
    } 
} 
+0

我觉得你的假设是正确的 - 这似乎有点MEF的目的是要解决的问题之外。 – GraemeF 2009-11-20 13:25:51

回答

29

默认情况下,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<IRule, IOrderMetadata>(
          lazyRule => lazyRule.Metadata.Order); 
    } 

    [ImportMany] 
    public OrderingCollection<IRule, IOrderMetadata> Rules { get; set; } 
} 

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

+0

谢谢!已经改变了我接受的答案给你。 – 2009-12-19 10:32:02

+0

伟大的解决方案! – Kilhoffer 2010-06-29 21:25:38

+0

看来OrderingCollection示例不再可用。 – tofutim 2015-03-10 17:11:59

1

你可以有规则导入相互顺序(使用Decorator模式),但随后每一条规则都需要了解它之前的具体规则,这可能不是你想要的。

MEF有助于您发现零件,之后您对它们所做的工作由您决定。如果你想对零件进行分类,那就继续吧,没有什么不对的!

+0

这证实了我的预期,谢谢。 – 2009-11-20 17:37:53

+0

对我来说,将元素插入排序列表比生成列表然后排序 – Assimilater 2017-06-23 18:12:33

6

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

检查此链接的信息,如何定义元数据和自定义的出口:link text

您也可以找到我们有用的MEF论坛this线程。您可以在其中找到有关AdaptingCollection方法的讨论,该方法可让您使用应用元数据过滤器/订单的自定义集合。

HTH 格伦

+0

谢谢格伦,最后我采取了不同的方法,但下次我会牢记这一点。我会接受你的回答,但正如韦斯在前面得到类似的回应,我认为接受他可能更公平。 – 2009-12-19 10:31:28

+0

没关系,韦斯基于他的版本:-) – 2009-12-21 21:59:58