3

背景: 私はMEFに、IFooを実装する2つのアセンブリをインポートしようとしています。そのために、当然のことながら、[ImportMany]を使用してすべてをインポートし、IEnumerable>を取得しています。次に、私の消費ロジックは、メタデータ「バー」に基づいて、インポートされたアセンブリのどれを使用するかを決定します。

各エクスポーターは、ExportMetadata属性で装飾されています。これは、次の場合に正常に機能します。

[Export(typeof(IFoo))]
[ExportMetadata("Bar", "Hello")]
public class Hello : IFoo
{...}

[Export(typeof(IFoo))]
[ExportMetadata("Bar", "World")]
public class World: IFoo
{...}

つまり、私のIEnumerableには2つのIFooがあります。

1つをデフォルトとして定義したいので、「Hello」も「World」も必要ない場合は、Barメタデータとして「Default」を使用するものを探します。私は次のようなIsMultipleプロパティを使用してこれを実行しようとしました:

[Export(typeof(IFoo))]
[ExportMetadata("Bar", "Hello", IsMultiple = true)]
[ExportMetadata("Bar", "Default", IsMultiple = true)]
public class Hello : IFoo
{...}

問題: IsMultipleプロパティと2番目の属性を追加すると、Helloクラスが結果のIEnumerableにプルされなくなります。

質問: MEFのクラスに2番目/デフォルトの指定でタグを付けるにはどうすればよいですか?

ありがとう!

4

1 に答える 1

3

このようなクラスで複数の完全に別個のエクスポートを公開するには、複数の「プロパティエクスポート」を使用して、この場合は「this」を返すのが最善の方法です。

class Hello: IFoo
{
    [Export, ExportMetadata(...)]
    public IFoo Bar { get { return this; } }

    [Export, ExportMetadata(...)]
    public IFoo Default { get { return this; } }
}
于 2012-05-10T16:08:14.743 に答える