2009-11-20 25 views
19

MEFでは、ImportMany属性を使用して複数の部品をインポートできます。関連するエクスポートを取得する順番をどのように決定し、それを挿入する列挙型に追加しますか?たとえば、特定の順序で起動する複数のIRulesをインポートするにはどうすればよいですか?私は考えることができる唯一の方法は、手動での並べ替えの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

答えて

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; } 
} 

次に、メタデータによって順序付けられた一連のルールがあります。 OrderingCollectionサンプルはhttp://codepaste.net/ktdgohにあります。

+0

ありがとう!あなたに受け入れられた答えを変えました。 –

+0

すばらしい解決策! – Kilhoffer

+0

OrderingCollectionサンプルはもう使用できないようです。 – tofutim

1

あなたはルールが(Decoratorパターンを使用して)ために、お互いをインポートするかもしれないが、その後、各ルールがする必要があります。おそらくあなたが望むものではない、それに先行する特定のルールについて知っています。

MEFは、部品を発見するのに役立ちます。後でそれを行うのは、あなた次第です。部品をソートして先に進めたいのであれば、何も問題はありません!

+0

これは、私が期待したことを確認した、ありがとう。 –

+0

私には、リストを生成してソートするよりも、ソートされたリストに要素を挿入するほうが効率的です。 – Assimilater

6

MEFでこの順序を達成する最良の方法は、私たちのメタデータ機能を利用することです。注文とフィルタリングに使用できるエクスポートに独自のメタデータを添付することができます。メタデータを使用すると、実際に必要となるまで部品のインスタンス化を遅らせることもできます。さらに、カスタムのエクスポート属性を作成することで、きれいにメタデータを提供することができます。メタデータとカスタムの輸出を定義する方法については、

チェックこのリンク:link text

また、便利な私たちのMEFフォーラムのthisスレッドを見つけることができます。ここには、メタデータのフィルタ/オーダーを適用するカスタムコレクションを使用できるAdaptingCollectionのアプローチについての説明があります。

HTH グレン

+0

グレンさん、ありがとうございました。私は別のアプローチをとっていましたが、次回はこれを覚えています。私はあなたの答えを受け入れるだろうが、ウェスが似たような反応で直前に着いたので、彼を受け入れるのはおそらくもっと公平だと思う。 –

+0

それは大丈夫です、ウェスは自分のバージョンをベースにしています:-) –

関連する問題