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

标签 .net plugins inversion-of-control mef

到目前为止,我在 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/

相关文章:

.net - 如何在 Windows Phone 8.1 中测试 "App Update"?

c# - 根据下拉列表在 asp.net 中选择的选项从文件夹动态加载多个图像

ruby-on-rails - 插件实现 : How to call a method on an ActiveRecord?

plugins - Xamarin.Forms 使用 Plugin.Media 拍照无法正常工作

dependency-injection - 是什么让 IoC 容器成为 IoC 容器?

c# - C# 中的空引用基本上是全零指针吗?

.net - 何时在面向 .NET 4.0 的应用程序中使用 IEqualityComparer

javascript - 如何使用 js-beautify 插件中的选项

asp.net-web-api - 我是否使用正确的生命周期管理器进行依赖注入(inject)?

c# - 带参数的 IoC 记录器