8

基本的なMEFの問題と思われるものを解決できません。2つの「プラグイン」プロジェクト(P1とP2と呼びます)と、両方のプラグインに共通する3番目のプロジェクト(Cと呼びます)があります。 。P1とP2は両方ともCを参照します。

P1に存在するコンポーネントをインポートしようとすると、このコンポーネントはCに存在するコンポーネントに依存しているため、失敗します。

トレースは次のとおりです。

System.ComponentModel.Composition警告:1:ComposablePartDefinition'MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel'が拒否されました。構成は変更されません。次のエラーのため、変更は拒否されました。コンポジションで複数のコンポジションエラーが発生し、4つの根本原因がありました。根本的な原因を以下に示します。詳細については、CompositionException.Errorsプロパティを確認してください。

1)制約に一致するエクスポートが見つかりませんでした'((exportDefinition.ContractName = "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel")&&(exportDefinition.Metadata.ContainsKey( "ExportTypeIdentity")&& "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel" .Equals(exportDefinition.Metadata.get_Item( "ExportTypeIdentity"))))'。

結果:パーツ'MyCompanyにインポート'MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel.CalypsoBookSelectorViewModel(ContractName = "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel")'を設定できません。 .Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel'。要素:MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel.CalypsoBookSelectorViewModel(ContractName = "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel")-> MyCompany.Client.Pms.Plugin .InclusionList.ViewModel.InclusionListViewModel-> DirectoryCatalog(Path = "C:\ Work \ mmtrader \ dashboard \ Code \ Src \ Dashboard \ MM \ Trader \ bin \ Debug \ Plugins \ Positions")

[...](他の3つの問題は、異なるビューモデルでまったく同じです)

MEFカタログを調べたところ、MEFはそれらのビューモデルを知っていることがわかったので、何が欠けているのかわかりません。

以下のデニスからのリクエストに応じて、これが私のインポート/エクスポートです。

書き出す:

Export(typeof(ICalypsoBookSelectorViewModel))]
public class CalypsoBookSelectorViewModel : ScreenWithCleanupLifecycle, ICalypsoBookSelectorViewModel
{...}

輸入:

[Import(typeof(ICalypsoBookSelectorViewModel))]
public ICalypsoBookSelectorViewModel CalypsoBookSelectorViewModel { get; set; }

そしてカタログ:

カタログ

よろしくお願いします!

4

4 に答える 4

9

私はついに問題を見つけました、そしてそれはMEFが指を向けていたCalypsoBookSelectorViewModelとは何の関係もありませんでした。

実際、ViewModelは別のコンポーネント(CalypsoBookSelectorModel)に依存しており、別のコンポーネントはIDispatcherコンポーネントに依存しています。

問題は、コントラクト名(以下を参照)で指定されたこのIDispatcherコンポーネントが2回(各プラグインで1回)エクスポートさたため、MEFがどちらを使用するかを判断できなかったことです。もちろん、本当の問題は、 MEFが、チェーンの2レベル上のクラスに指を向けるのではなく、そのことを教えてくれるはずだったことです。

問題を見てくれたデニスに感謝します。これが同じ問題を抱える他の人々の助けになることを願っています。

ディスパッチャのインポート:

[Import(DispatcherNames.BackgroundDispatcherName, typeof(IDispatcher))]
public IDispatcher Dispatcher { get; set; }
于 2012-09-13T09:23:27.403 に答える
6

から何かP1をインポートしますC(より正確にはICalypsoBookSelectorViewModel)。

MEFコンテナが作成しようとすると、からに依存P1するすべてのインポートも解決しようとします。したがって、独自のカタログおよび親のエクスポートプロバイダーで、タイプ(実際には、契約名ですが、この場合は関係ありません) P1のエクスポートの検索を実行します。ICalypsoBookSelectorViewModel

そのようなエクスポートが見つからない場合(これはあなたの場合です)、MEFコンテナの構成は変更されません。
これを修正する[Export(typeof(ICalypsoBookSelectorViewModel))]には、対応する型定義に追加する必要があります。

もちろん、これはすべて、カタログプロバイダーとエクスポートプロバイダー(存在する場合)が適切に初期化されていることを意味します。

このエクスポート定義は等しくないことに注意してください。

public interface IA {}

[Export(typeof(IA))] // contract name is "IA"
public class A : IA {}

[Export] // contract name is "A"
public class A : IA {}

[Export]
public class Composed
{
    [Import] // MEF will search for exports like [Export(typeof(IA))]
    private IA field1;

    [Import] // MEF will search for exports like [Export]
    private A field1;
}
于 2012-09-13T08:42:17.593 に答える
0

彼が使用しているためにエラーが発生します。[Import]複数のインポートには使用する必要があります[ImportMany]

于 2017-08-22T21:27:00.280 に答える
0

私はそれに入った後、この問題の解決策を探していました。エクスポートクラスでSystem.ComponentModel.Compositionを使用する代わりに、System.Compositionを使用していることに気付きました。

于 2020-04-24T09:57:39.050 に答える