MEF の構成ファイル設定はありますか、それともすべてコードで行われますか?
すべてがコード内にある場合、エクスポートを行うさまざまなクラスを切り替えるためのベスト プラクティスは何ですか? つまり、クラス A とクラス B の両方が IMyExport をエクスポートする場合、A または B を使用するようにアプリを「構成」する良い方法は何ですか?
私の知る限り、MEF には構成ファイルがありません。アプリケーションで 1 つの実装を別の実装よりも使用したい場合はConfigurationCatalog
、構成ファイルを入力として取得し、指定された部分のみをエクスポートする新しいものを作成できます。そのようなものがすでにMefContribに存在する可能性があるので、そこで確認します。
それ以外では、どの実装を使用するかはクラス自身が決定します。あなたが望むものを達成するための1つの可能な方法は、コントラクト名を使用することです
[Export("My Contract Name", typeof(IMyExport))]
public class A : IMyExport { }
[Export("Another Contract Name", typeof(IMyExport))]
public class B : IMyExport { }
次に、クラスのインポートIMyExport
で、使用するパーツを指定できます
[Import("Another Contract Name")]
public IMyExport MyExport { get; set; }
特定の依存関係IMyExport
を複数回エクスポートできることがわかっている場合は、エクスポートにメタデータを追加し、そのメタデータに従って使用するエクスポートを実行時に決定できます。その方向に進むと、コードは次のようになります
[MySpecialExport(SomeData = "ABC")]
public class A : IMyExport { }
[MySpecialExport(SomeData = "DEF")]
public class B : IMyExport { }
public class MyClass
{
[ImportMany(typeof(IMyExport))]
public IEnumerable<Lazy<IMyExport, IMyExportMetadata>> MyProperty { get; set; }
public void DoSomething()
{
var myLazyExport = MyProperty.FirstOrDefault(x => x.Metadata.SomeData == "DEF");
IMyExport myExport = myLazyExport.Value;
// Do something with myExport
}
}