2

エクスポートとインポートで見つかったメタデータに基づいて条件付きでエクスポートする ExportProvider を作成しようとしています。メタデータのエクスポートは簡単です:

[Export(typeof(ITestExport))]
[TestExportMetadata(MetadataStr = "A", MetadataInt = 2)]
public class TestExportClass1 : ITestExport
{
}

エクスポート メタデータを調べて、それに基づいてエクスポートを提供するのは簡単です。インポートのためにやりたいことは、おそらく次のようなものです。

public class TestImportClass1
{
    [Import(typeof(ITestExport))]
    [TestImportMetadata(MetadataStr = "A", MetadataInt = 2)]
    ITestExport MyExportedValue { get; set; }
}

ここでは、TestImportMetadata の実際の署名は重要ではありませんが、インポートになんらかのメタデータを提供し、そのインポートを満たすときにそれを参照できるようにしたいと考えています。残念ながら、エクスポートと同様にメタデータをインポートに適用するための設計された同等のプロセスはないようです。

ExportProvider 基本クラスは、抽象メソッドを提供します。

protected abstract IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition);

このメソッドに提供される ImportDefinition は、直接または間接的に、メタデータまたは少なくとも ImportAttribute 自体に何らかのアクセスを提供すると思いますが、そうではないようです。

これが私が説明した方法では不可能である場合、インポートを満たすために、インポートメタデータを提供してアクセスするための代替方法を誰かが考えられますか?

4

1 に答える 1

2

.NET 4.5 をターゲットにしている場合は、 「同梱」の MEF バージョンの代わりにMicrosoft.Composition NuGet パッケージを使用できます。これにはいくつかの機能上の違いがあり、ドロップインの代替品ではありませんが、追加された機能の 1 つはImportMetadataConstraint属性です。

public class TestImportClass1
{
    [Import(typeof(ITestExport))]
    [ImportMetadataConstraint("MetadataStr", "A")]
    [ImportMetadataConstraint("MetadataInt", 2)]
    public ITestExport MyExportedValue { get; set; }
}

これはカスタム メタデータ属性でも機能するため、代わりに次のように記述できます。

public class TestImportClass1
{
    [Import(typeof(ITestExport))]
    [TestExportMetadata(MetadataStr = "A", MetadataInt = 2)]
    public ITestExport MyExportedValue { get; set; }
}

(ここでインポートとして使用するには、プロパティを公開する必要があることに注意してください。)

于 2012-08-21T11:38:33.580 に答える