5

MEF の構成ファイル設定はありますか、それともすべてコードで行われますか?

すべてがコード内にある場合、エクスポートを行うさまざまなクラスを切り替えるためのベスト プラクティスは何ですか? つまり、クラス A とクラス B の両方が IMyExport をエクスポートする場合、A または B を使用するようにアプリを「構成」する良い方法は何ですか?

4

1 に答える 1

7

私の知る限り、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
    }
}
于 2012-07-20T19:50:13.200 に答える