我有一个带有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
中答案 0 :(得分:2)
在棱镜编程中,模块和外壳应分开。不得从一个模块向另一个模块或外壳声明直接引用。您需要做的是使用EventAggregator
以便在模块或shell之间交换消息。
使用IEventAggregator
的另一种方法是使用RegionScopes传递消息。
总结一下,不要在模块和shell之间创建直接引用;使用IEventAggregator交换消息并在一个公共库中声明携带事件的消息,该库由所有模块和shell重用。