在MEF中查找重复导出

时间:2014-06-20 01:29:10

标签: prism mef

我正在使用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源代码但找不到它。

1 个答案:

答案 0 :(得分:0)

我假设您正在使用Prism.MefExtensions库并拥有MefBootstrapper。该库会在此source file

中为您导出EventAggregator

我无法想到在运行引导程序之前您需要EventAggregator的情况。能够在那里访问它是否足够? MefBootstrapper具有受保护的Container属性,您可以使用该属性来访问容器并获取EventAggregator。

Container.GetExportedValue<IEventAggregator>();

我认为您的另一个选择是将您的导出定义设置为EventAggregator并远离接口以避免重复。