2016-08-31 2 views
5

サンプルPRISMアプリケーションで作業しています.MEF RegistrationBuilderを使用してすべてのエクスポートを作成したいと考えています。次のようにExportAttributeを使用するのと同じです:MEF RegistrationBuilderを使用してPRISM ModuleExportを作成することはできますか?

[Export(typeof(IFooService))] 
public class FooService : IFooService { ... } 

Builder.ForTypesMatching(typeof(IFooService).IsAssignableFrom(type)).Export<IFooService>(); 

はしかし、モジュールは、例えば、異なる属性、ModuleExportAttributeを使用します。

[ModuleExport(typeof(ModuleA), DependsOnModuleNames = new string[] { "ModuleB" })] 
public sealed class ModuleA : IModule { ... } 

私はRegistrationBuilderクラスを使用するかどうかはわかりませんModuleExportAttributeを使用する代わりにモジュールエクスポートを作成します。これは、標準のエクスポートとは異なる方法でエクスポートされるため可能ですか?

答えて

1

The ModuleExport attributeは、本質的にはタイプセーフなメタデータ(IModuleExport)を使用したExport(typeof(IModule))のatttibuteです。 RegistrationBuilderでこのメタデータを自分自身で簡単に「コピー」できます。

[ImportMany] 
Lazy<IModule, IModuleExport>[] Modules { get; set; } 

あなたはすべてのメタデータに指定する必要があることに注意してください。例

RegistrationBuilder builder = new RegistrationBuilder(); 
builder.ForType<ModuleA>().Export<IModule>(eb => eb 
    .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" }) 
    .AddMetadata("InitializationMode", InitializationMode.WhenAvailable) 
    .AddMetadata("ModuleName", "ModuleA") 
    .AddMetadata("ModuleType", typeof(ModuleA))); 

のためにあなたは、このプリズムは舞台裏で何をするかは基本的であるので、のようなあなたのモジュールをインポートすることで動作を確認することができます(彼らはIModuleExportインタフェースを満たさないように)IModuleExportインタフェースのプロパティ、またはモジュールは


01インポートされません

回答に追加:

上記のコードを正しい作業方法です。以下のコードは正しく見えますが、動作しません。

これは、PartBuilder.Export(Action<ExportBuilder> exportConfiguration)のオーバーロードを使用する場合にのみ機能することに注意することが重要です。

RegistrationBuilder builder = new RegistrationBuilder(); 
builder.ForType<ModuleA>().Export<IModule>() 
    .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" }) 
    .AddMetadata("InitializationMode", InitializationMode.WhenAvailable) 
    .AddMetadata("ModuleName", "ModuleA") 
    .AddMetadata("ModuleType", typeof(ModuleA)); 
+0

推奨されるコードです。正しい 'Export()'オーバーロードを使用する必要があることに注意することが重要です。さらに、メタデータをすべて追加する必要はなく、必要な部分だけを残し、残りはデフォルト値を持ちます。これは 'InitializationMode'や依存関係などを指定したくない場合には問題ありません。ありがとうございました! –

+0

私はそれをチェックしたときに、 'DependsOnModuleNames'メタデータだけのモジュールを読み込めなかったので、すべてのメタデータを追加する必要があると仮定しました。たぶん、いくつかのプロパティが必要であり、いくつかはオプションですが、どのプロパティがどのようなものかを知る方法がわかりません。 –

関連する問題