1

1つのイベントを持つインターフェイスIModuleMainServiceを持つ1つのモジュールがあります。

例えば[Export(typeof(IModuleMainService))]

インターフェイスIMainServiceを備えたSHELLがあります。

例えば[Export(typeof(IMainService))]

ModuleMainでインポートしました[Import(typeof(IMainService)]

この場合、アプリケーションは機能していますが、モジュールおよびシェルと通信したいと思います。

Shell.csへのインポートを挿入しようとしています。

[Import]
public IModuleMainService ModuleMainService { get; set; }

しかし、アプリケーションを実行するとエラーが発生します。以下を参照してください。[Import] public IModuleMainService...成功したアプリケーションをコメントすると。問題はどこにありますか?

ポイントは、SHELLのModuleクラスのConsumイベントです。

System.ComponentModel.Composition警告:1:ComposablePartDefinition'Main.Silverlight.Views.Shell'が拒否されました。構成は変更されません。次のエラーのため、変更は拒否されました。コンポジションで単一のコンポジションエラーが発生しました。根本的な原因を以下に示します。詳細については、CompositionException.Errorsプロパティを確認してください。

1)制約に一致する有効なエクスポートが見つかりませんでした'((exportDefinition.ContractName == "Main.ViewModels.ShellViewModel")AndAlso(exportDefinition.Metadata.ContainsKey( "ExportTypeIdentity")AndAlso "Main.ViewModels.ShellViewModel" .Equals( exportDefinition.Metadata.get_Item( "ExportTypeIdentity"))))'、無効なエクスポートが拒否された可能性があります。

結果:パーツ'Main.Silverlight.Views.Shell'にインポート'Main.Silverlight.Views.Shell.ViewModel(ContractName = "Main.ViewModels.ShellViewModel")'を設定できません。要素:Main.Silverlight.Views.Shell.ViewModel(ContractName = "Main.ViewModels.ShellViewModel")-> Main.Silverlight.Views.Shell-> AssemblyCatalog(Assembly = "Main、Version = 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null ")

タイプ'System.ComponentModel.Composition.ImportCardinalityMismatchException'の最初のチャンスの例外がSystem.ComponentModel.Compositionで発生しました

4

1 に答える 1

2

プリズムプログラミングでは、モジュールとシェルを分離する必要があります。あるモジュールから別のモジュールまたはシェルへの直接参照は宣言されません。あなたがする必要があるのはEventAggregator、モジュールまたはシェルの間でメッセージを交換するために採用することです。

を使用する代わりに、IEventAggregatorRegionScopesを使用してメッセージを渡すこともできます。

要約すると、モジュールとシェルの間に直接参照を作成しないでください。IEventAggregatorを使用してメッセージを交換し、すべてのモジュールとシェルで再利用される共通ライブラリでメッセージ伝送イベントを宣言します。

于 2012-05-25T06:00:19.130 に答える