到目前为止,我在 MEF 中遇到的最大问题是,当我在我的插件加载器包装器中组合部件时,当它发现其中一个程序集的导入解析问题时完全加载。理想情况下,我希望 ComposeParts 表现出某种“忽略并继续”行为,因为理想的用户体验需要加载尽可能多的插件,并在特定插件加载失败时简单地记录一个事件。我无法在任何地方的文档中找到有关此的信息。
如果您对如何解决这个问题有任何其他建议,我在听!
最佳答案
Wim 的示例具有基本思想,但我建议您不要直接拉动容器,而是像这样执行 Lazy ImportMany:
[Export]
public class MyApplication
{
[ImportMany(typeof(IPlugin))]
public IEnumerable<Lazy<IPlugin>> Plugins { get; set; }
}
然后你可以一一初始化插件并从它们中捕获任何错误,例如:
void InitializePlugins()
{
foreach (Lazy<IPlugin> plugin in Plugins)
{
try
{
plugin.Value.Initialize();
}
catch (CompositionException e)
{
// Handle the error accordingly
}
}
}
在您第一次拉取 .Value 之前不会创建实际的插件,如果插件在导入的构造函数或属性 setter 中有错误,则会发生错误。另请注意,如果插件出现错误,我会捕获 CompositionException,这是 .Value 调用中的结果。
关于.net - MEF 的 CompositionContainer.ComposeParts -- 加载可以解决的任何内容,并忽略错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2974359/