2009-11-20 66 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