使用Modular Silverlight应用程序重构问题

时间:2012-07-25 18:04:10

标签: silverlight mef

我正在使用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 attribut那么简单。

我已经下载了VisualMFX,但是这行代码抛出了一个Object Not initialized异常。

this.compositionInfo = new CompositionInfo(_aggregateCatalog,  _container);

_aggregateCatalog&发生这种情况时,_container不为空。

总之,为什么第7个模块突然开始导致重组?特别是当模块此时甚至没有定义任何出口或进口时?这导致我们如何阻止它解决这个问题?

1 个答案:

答案 0 :(得分:0)

该问题最终成为对Copy Local设置为true的程序集的引用。

确保所有在主应用程序集中设置的引用都设置为Copy Local = false似乎解决了问题。