20

ImportManyMEF では、属性を使用して複数のパーツをインポートできます。関連するエクスポートを取得し、それらを入力している列挙型に追加する順序をどのように決定しますか? たとえば、特定の順序で起動する必要がある複数の IRule をインポートするにはどうすればよいでしょうか? 私が考えることができる唯一の方法は、IRule に OrderValue プロパティを設定し、手動で並べ替えることです。

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();
    }
  }
}
4

3 に答える 3

31

デフォルトでは、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にあります。

于 2009-11-20T18:54:47.377 に答える
6

MEF でこの順序付けを実現する最善の方法は、メタデータ機能を利用することです。順序付けとフィルタリングに使用できる独自のメタデータをエクスポートに添付できます。メタデータを使用すると、実際に必要になるまでパーツのインスタンス化を遅らせることもできます。さらに、メタデータを提供するきれいな方法を提供するカスタム エクスポート属性を作成できます。

メタデータとカスタム エクスポートを定義する方法については、このリンクを確認してください:リンク テキスト

また、MEF フォーラムのこのスレッドも役立つ場合があります。その中には、メタデータ フィルター/順序を適用するカスタム コレクションを使用できる AdaptingCollection アプローチに関する説明があります。

HTHグレン

于 2009-11-20T18:56:02.820 に答える
1

(Decorator パターンを使用して) ルールを順番にインポートすることもできますが、その場合、各ルールはその前にある特定のルールについて知る必要があります。

MEF は、パーツの発見を支援するためにあります。後でそれらをどうするかは、あなた次第です。部品を並べ替えたい場合は、それで問題ありません。

于 2009-11-20T13:32:07.693 に答える