1

同じインターフェースの複数の実装がある場合

[Export("DALREMOTE", typeof(IDAL))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class DAL : IDAL

[Export("DALLOCAL", typeof(IDAL))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class DAL : IDAL

モジュールのコンストラクターで標準として使用する実装をプログラムで選択する方法はありますか。

[ImportingConstructor]
public ShellViewModel(IDAL dal........

私はPRISM/MEFブートストラップを使用していますが、そこに置くこともできます

4

1 に答える 1

1

コントラクト名を使用しているため、特定のパラメーターの ImportAttribute の一部としてコントラクト名を指定できます。

「DALLOCAL」コントラクト名を使用した例を次に示します。

[ImportingConstructor]
public ShellViewModel([Import("DALLOCAL")]IDAL dal........

ImportAttributeを使用して、パラメーターとプロパティを装飾できます

コメントによると、コントラクト名を使用したくないため、実行時に何らかのアプリ構成から実装を選択できるようにしたいため、エクスポート メタデータを使用できます。弱いメタデータを使用した例を次に示します。

[Export("DALREMOTE", typeof(IDAL))]
[ExportMetadata("Tag", "DALREMOTE")]
[PartCreationPolicy(CreationPolicy.Shared)]
public class DAL : IDAL

[Export("DALLOCAL", typeof(IDAL))]
[ExportMetadata("Tag", "DALLOCAL")]
[PartCreationPolicy(CreationPolicy.Shared)]
public class DAL : IDAL

「タグ」は任意のキーであることに注意してください。また、プログラムの他の部分で必要な場合は、名前付きコントラクトを保持できることにも注意してください。

コンストラクターは次のようになります。

[ImportingConstructor]
public ShellViewModel([ImportMany]IEnumerable<Lazy<IDAL, IDictionary<string, object>>> dals)
{
    if (dals == null) throw new ArgumentNullException("dals");

    //Get the tag from your apps configuration.
    string tagFromConfiguration = ........

    _dal = dals.Where(l => l.Metadata["Tag"].Equals(tagFromConfiguration )).Single().Value;
}

ここでの主な違いは、単一の IDAL ではなく、一連の IDAL が注入されることです。次に、.ctor で、必要な IDAL を選択する必要があります。Enumerable.Singleの使用は、特定のタグ値を持つ単一のエクスポートされた IDAL がある場合にのみ機能することに注意してください。

MEF の Codeplex ドキュメントのExports and Metadataガイドには、役立つ例が多数含まれています。

于 2013-07-01T12:54:29.260 に答える