【问题标题】:MEF ComposeParts. How to handle plugin exceptionsMEF ComposeParts。如何处理插件异常
【发布时间】:2014-08-06 13:53:26
【问题描述】:

我在网上搜索了解决方案,但没有找到任何解决方案。

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

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

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    我猜你正在调用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
            }
        }
    }
    

    【讨论】:

    • 在我尝试之前,这个答案在理论上看起来不错;我的错误是由于未提供 Import 期望的等效 Export 引起的;我的this 课程中有多个导入;我不相信在这种情况下推迟构造函数错误会有所帮助 - ComposeParts() 以“全有或全无”的方式失败(即它不会继续组成良好的导入/导出对,如果有一个一对导入/导出有问题!
    【解决方案2】:

    我发现从 ImportMany 切换到 Import 然后基本上为每个 Dll 创建一个 CompositionContainer + DirectoryCatalog 可以让我轻松检测和过滤掉不兼容的插件。

    它也不比同时在多个目录上调用 compose 慢很多。

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多