PRISM MEF中模块和SHELL之间的通信

时间:2012-05-25 05:30:16

标签: c# shell module prism mef

我有一个带有IModuleMainService接口的模块,只有一个事件。

e.g。 [Export(typeof(IModuleMainService))]

我有SHELL接口IMainService。

e.g。 [Export(typeof(IMainService))]

在ModuleMain中,我有导入[Import(typeof(IMainService)]

在这种情况下应用程序正常工作,但我想与模块和shell进行通信。

我尝试将导入插入Shell.cs,例如

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

但是我运行应用程序并且我收到错误,请看下面的内容。如果我评论运行成功的[Import] public IModuleMainService...应用程序。 哪里有问题?

Point是: 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.ViewModel(ContractName =" Main.ViewModels.ShellViewModel")'部分' Main.Silverlight.Views.Shell'。 元素:Main.Silverlight.Views.Shell.ViewModel(ContractName =" Main.ViewModels.ShellViewModel") - > Main.Silverlight.Views.Shell - > AssemblyCatalog(Assembly =" Main,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null")

类型' System.ComponentModel.Composition.ImportCardinalityMismatchException'的第一次机会异常。发生在System.ComponentModel.Composition

1 个答案:

答案 0 :(得分:2)

在棱镜编程中,模块和外壳应分开。不得从一个模块向另一个模块或外壳声明直接引用。您需要做的是使用EventAggregator以便在模块或shell之间交换消息。

使用IEventAggregator的另一种方法是使用RegionScopes传递消息。

总结一下,不要在模块和shell之间创建直接引用;使用IEventAggregator交换消息并在一个公共库中声明携带事件的消息,该库由所有模块和shell重用。