2

私は自分の問題に対する答えを見つけることができませんでした。MEFを使用してIPlugInを実装するクラスを見つけて作成していますが、最終的には各PlugInクラスの2つのバージョンになります。AggregateCatalogには、パーツとして各クラスの1つのタイプのみを含む1つのアセンブリのみが含まれていると判断しましたが、最終結果としてそれぞれ2つのインスタンスを取得しています。私はおそらく愚かなことをしているだけですが、まだそれを見つけていません。助けていただければ幸いです...

..。

    [ImportMany(typeof(IPlugIn))]
     publicSystem.Lazy>[]プラグイン{get; セットする; }

..。
    //aggregatecatalogにはプラグインクラスを含むdllが1つだけ含まれています。そのうちの4つは
    コンテナ=新しいCompositionContainer(aggregateCatalog、
                                         CompositionOptions.DisableSilentRejection
                                         | CompositionOptions.IsThreadSafe); \

    container.SatisfyImportsOnce(this);

    ..。
    public void StartAll()
    {{
    //ここに8つのプラグインがありますか?どのように?
    if(Plugins == null || Plugins.Count()== 0)
    {{

       log.Warn( "開始できるプラグインがありません!");
       戻る;
    }

        foreach(varプラグインプラグイン)
        {{
            log.Info( "プラグインの開始:" + plugin.Value.GetName());
            plugin.Value.Start();
        }
    }

   ..。

    [Export(typeof(IPlugIn))]
    パブリッククラスMyPlugIn:BasePlugIn、IPlugIn

    ..。

VisualStudioでデバッグしています。アセンブリのロードが1つだけはっきりとわかります。CompositionContainerにはそれぞれ1つしかありません。StartAll()でSatisfyImportOnceを実行した後、各IPlugInクラスのインスタンスが2つあります。これは私がImportManyを使用している方法と何か関係がありますか?私はどんなアイデアにもオープンです。

4

2 に答える 2

3

解決策は単純であることが判明しました。IPlugInインターフェースから[AliExpressExport]を完全に削除したところ、正しい数のプラグインが作成されました。各PlugInサブクラスから[Export...を削除した場合、プラグインはまったく取得されませんでした。複数のインスタンスを作成したのは、この2つの組み合わせでした。

于 2012-11-12T20:03:21.483 に答える
2

InheritedExportインターフェイスに属性がある場合はInheritedExport、インターフェイスを実装するクラスでを使用する必要があります。適用するExportと、追加のパートが作成されます。これが、あなたが見つけたものです。

ExportMetadataまた、を使用してインターフェイスを実装するクラスに他のものを適用する場合は、メタデータを追加するために属性を再度InheritedExport追加する必要があります(継承されたメタデータがない場合でも置き換えます)。これは、 AttachedExportまたはExportMetadataのMSDNドキュメントでは対処されていませんが、他のあいまいなMicrosoftドキュメントでいくつかのあいまいな参照に遭遇しました。InheritedExport

于 2014-12-02T15:14:54.287 に答える