我正在使用MEF并在我的合成容器中有重复导出。当我执行以下操作时,我可以看到副本。
var exports = GlobalContainer.GetExports<IEventAggregator>();
但是当我尝试搜索合成容器的部分时,我找不到副本。
var parts = this.AggregateCatalog.Parts;
var definitions = new List<ExportDefinition>();
foreach ( var part in parts )
{
definitions.AddRange( part.ExportDefinitions );
}
definitions.Sort( ( a , b ) => string.Compare( a.ContractName , b.ContractName ) );
var extraDefs = new List<ExportDefinition>();
foreach ( var def in definitions )
{
if ( def.ContractName.Contains( "EventAggregator" ) )
extraDefs.Add( def );
}
我正在使用Prism,在Prism初始化之前我需要EventAggregator。我可以将EventAggregator作为CompositionBatch手动添加到容器中,但是在初始化Prism之后,我得到一个InvalidOperationException,因为有两个事件聚合器。有没有办法删除导出定义或保持棱镜加载其定义的方法。在Prism 4中,MefEventAggregator使用AssemblyCatalog作为导出完成,因此可能无法抑制Prism创建。我想查看容器的GetExports源代码但找不到它。
答案 0 :(得分:0)
我假设您正在使用Prism.MefExtensions库并拥有MefBootstrapper
。该库会在此source file
EventAggregator
我无法想到在运行引导程序之前您需要EventAggregator的情况。能够在那里访问它是否足够? MefBootstrapper具有受保护的Container属性,您可以使用该属性来访问容器并获取EventAggregator。
Container.GetExportedValue<IEventAggregator>();
我认为您的另一个选择是将您的导出定义设置为EventAggregator并远离接口以避免重复。