我正在使用 Silverlight 4 应用程序,我们使用 Prism/MEF 来构建模块。
每个模块都是作为 Silverlight 应用程序创建的。然后,我们使用 ModulesCatalog.xaml 文件来控制模块的加载方式。
我们有 6 个模块,一切都很完美。
本周我们将添加第 7 个模块,我们刚刚创建了新的 Silverlight 应用程序。我们如下设置模块类。
[ModuleExport(typeof(InsightModule))]
public class InsightModule : IModule
{
}
然后我们在 ModulesCatalog 文件中添加了一个条目。
现在,当我们运行应用程序时,我们开始收到所有类型的重组错误。堆栈显示了这一点。
at System.ComponentModel.Composition.CompositionResult.ThrowOnErrors(AtomicComposition atomicComposition)
at System.ComponentModel.Composition.Hosting.ExportProvider.OnExportsChanging(ExportsChangeEventArgs e)
at System.ComponentModel.Composition.Hosting.CatalogExportProvider.OnCatalogChanging(Object sender, ComposablePartCatalogChangeEventArgs e)
at System.ComponentModel.Composition.Hosting.ComposablePartCatalogCollection.OnChanging(Object sender, ComposablePartCatalogChangeEventArgs e)
at System.ComponentModel.Composition.Hosting.AggregateCatalog.OnChanging(ComposablePartCatalogChangeEventArgs e)
at System.ComponentModel.Composition.Hosting.ComposablePartCatalogCollection.RaiseChangingEvent(Lazy`1 addedDefinitions, Lazy`1 removedDefinitions, AtomicComposition atomicComposition)
at System.ComponentModel.Composition.Hosting.ComposablePartCatalogCollection.Add(ComposablePartCatalog item)
at Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleInitializer.CreateModule(ModuleInfo moduleInfo)
at Microsoft.Practices.Prism.Modularity.ModuleInitializer.Initialize(ModuleInfo moduleInfo)
然后你得到标准输出。
异常消息是:组成保持不变。由于以下错误,更改被拒绝: 合成产生了多个合成错误,有 57 个根本原因。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。
1) 部分 'EyeCue.Common.AboutEyeCueView' 上的不可重组导入 'EyeCue.Common.AboutEyeCueView.ViewModel (ContractName="EyeCue.Common.AboutEyeCueVM")' 阻止了出口的变化。
令人费解的是为什么其他 6 个模块都没有引起这个问题,但现在突然之间,这个没有任何内容的新模块导致目录的重组。这没有道理。
另外,在某些情况下,我有导入的 ctor,这就是我必须做的才能让事情正常工作,所以这不像设置 Allow Recomposition 属性那么简单。
我已经下载了 VisualMFX,但是这行代码会引发 Object Not initialized 异常。
this.compositionInfo = new CompositionInfo(_aggregateCatalog, _container);
发生这种情况时,两者_aggregateCatalog
&_container
都不为空。
总之,为什么第 7 个模块会突然开始导致重组?特别是当模块此时甚至没有定义任何导出或导入时?这导致我们如何阻止它来解决这个问题?