我试图了解使用MEF时我们做错了什么。
以下是我们初始化容器的方法:
var files = Directory.GetFiles(bin, "*.dll").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray();
var filesexe = Directory.GetFiles(bin, "*.exe").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray();
var catalog = new AggregateCatalog( files.Concat(filesexe).Select(file => new AssemblyCatalog(file)));
m_container = new CompositionContainer(catalog, true);
鉴于该容器,我们调用GetExportedValueOrDefault
或GetExportedValue
来实际解析根级依赖关系。虽然通常会通过导入构造函数或属性自动解析它们。
应用程序在一开始就调用GetExportedValueOrDefault
方法来执行某些关键验证,否则必须立即中止应用程序。
我们的问题是,对GetExportedValueOrDefault
方法的第一次调用现在大约需要35秒。
我们正在使用.NET 4.5附带的标准MEF。应用程序非常庞大,并且通过MEF注入了很多类,但是花费35秒似乎不合逻辑。
此延迟可能逐渐增加,但现在它大于启动Windows服务的服务控制管理器超时。所以我们增加了超时,但这不是我们正在寻找的解决方案。
此时迁移到Microsoft.Composition
(又名MEF-2)是不可行的。
使用RedGate的ANTS分析器进行分析可以得到:
除了有一些疯狂的反思之外,什么都没给我任何东西。我不明白如何继续前进。我该如何排除故障?
有什么想法吗?