MEF ComposeParts。如何处理插件异常

时间:2014-08-06 13:53:27

标签: .net c#-4.0 exception plugins mef

我在网上搜索了一个解决方案,但我找不到任何东西。

在我的C#应用​​程序中,我使用MEF来实现插件模式。一切都很好。但是今天我试图弄清楚如果插件构造函数由于某种原因抛出异常会发生什么。

要加载插件我正在使用CompositionContainer.ComposeParts。如果由于某种原因,其中一个X插件会抛出异常,则此方法将失败,并且不会加载任何内容。

有没有办法只捕获单个异常,记录并继续?

提前谢谢。

1 个答案:

答案 0 :(得分:5)

我猜你在调用CompositionContainer.ComposeParts(this),其中this的属性与此类似:

[ImportMany]
public IPlugin[] Plugins { get; set; }

这意味着当你调用ComposeParts时,将调用所有插件的构造函数。或者,您可以利用延迟加载,这将在您实际使用插件时将构造函数调用推迟

[ImportMany]
public Lazy<IPlugin>[] Plugins { get; set; }

然后,如果你想初始化所有插件,你可能会有这样的东西,它会记录异常,但不会阻止你加载其他插件:

public void InitPlugins()
{
    foreach (Lazy<IPlugin> lazyPlugin in Plugins)
    {
        try
        {
            // Call the plugin's constructor
            var plugin = lazyPlugin.Value;

            // Do any other initialization here
        }
        catch (Exception ex)
        {
            // Log exception and continue iteration
        }
    }
}