MEF的CompositionContainer.ComposeParts - 加载可以解决的任何内容,并忽略错误

Dav*_*ave 5 .net plugins mef inversion-of-control

到目前为止,MEF最大的问题是,当我在插件加载器包装器中编写部件时,在发现其中一个程序集的导入解决问题时完全加载.理想情况下,我希望ComposeParts能够展示某种"忽略和继续"行为,因为理想的用户体验需要加载尽可能多的插件,并且只需在特定插件无法加载时记录事件.我无法在任何地方的文档中找到有关此信息.

如果您对如何解决这个问题有任何其他建议,我正在听!

Wes*_*ard 10

Wim的例子有基本的想法,但不是直接拉动容器我建议你做一个像这样的懒惰ImportMany:

[Export]
public class MyApplication
{
   [ImportMany(typeof(IPlugin))]
   public IEnumerable<Lazy<IPlugin>> Plugins { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以逐个初始化插件并从中捕获任何错误,如:

void InitializePlugins()
{
   foreach (Lazy<IPlugin> plugin in Plugins)
   {
       try
       {
          plugin.Value.Initialize();
       }
       catch (CompositionException e)
       {
          // Handle the error accordingly
       }
   }   
}
Run Code Online (Sandbox Code Playgroud)

直到你拉上.Value才会创建实际的插件.第一次是值,如果插件在构造函数或导入的属性设置器中有错误,则会发生错误.另请注意,我抓住了CompositionException,如果插件出错了,它将从.Value调用中产生.