これは私の最初のSOの質問ですので、ご容赦ください...
ConventionBuilder クラスを使用して MEF2 でコンポーネントをロードしようとしています。インポートされた型の属性として利用できるメタデータにアクセスする必要があるまで、すべてが期待どおりに機能します。次のクラスがあるとします。
[RuntimeCheckAttribute("MyString1", "MyString2", MyEnum.Value1)]
class ImportedClass : IRuntimeCheck
{...}
これで、「IRunTimeCheck」のインスタンスの規則を定義する ConventionBuilder インスタンスを作成できます。
ConventionBuilder conventions = new ConventionBuilder();
conventions.ForTypesDerivedFrom<IRuntimeCheck>()
.Export(exp => exp.AsContractType<IRuntimeCheck>()).Shared();
次に、アセンブリのリストを検査するように構成された「CompositionHost」インスタンスを利用します。への呼び出し
var runtimeChecks = container.GetExports<IRuntimeCheck>();
次に、エクスポートされたすべての「IRuntimeCheck」タイプのインスタンスを作成します。
私の質問は、エクスポート プロセス中に IRunTimeCheck 型のメタデータにアクセスする方法です。MEF1 では、ImportMany / Lazy メカニズムを利用できました。「CompositionHost」のすべてのエクスポート オーバーロードではメタデータ属性にアクセスできないため、これまで MEF2 でこの動作を再構築する良い方法を見つけていませんでした。
AddPartMetaData を使用して、ConventionBuilder レベルでメタデータを追加することができました。
conventions.ForTypesDerivedFrom<IRuntimeCheck>()
.AddPartMetadata("securityRuntimeMetadata", AddRuntimeCheckMetadata)
.Export(exp => exp.AsContractType<IRuntimeCheck>()).Shared();
private object AddRuntimeCheckMetadata(Type arg)
{
RuntimeCheckAttribute metadata = (arg.GetCustomAttributes<RuntimeCheckAttribute>(false) as
RuntimeCheckAttribute[]).FirstOrDefault();
if (metadata == null)
{
throw new InvalidOperationException("errorMessage");
}
return metadata;
}
MEF2 コードをデバッグすると、メタデータ情報が規約ビルダー レベルで追加されていることがわかります。しかし、この情報を再度エクスポートする方法がわかりませんでした。ExportFactory を利用しようとする投稿がいくつか見つかりました。しかし、それらのほとんどは、私の目標ではない非共有エクスポートで作業しています。