【问题标题】:Robust C# Plugin System强大的 C# 插件系统
【发布时间】:2010-05-22 13:51:45
【问题描述】:

我正在编写一个工具,它可以与多个版本控制系统(subversion 或 clearcase)进行通信,并且具有可以插入其中的各种实用程序。我想使用 MEF 来加载版本控制提供程序和实用程序,它们都有为它们定义的接口。

我已经开始为此使用 MEF。但是,如果加载任何插件失败(在我的一半客户端机器上,ClearCase COM 绑定将不存在,因此加载将失败,另一半将不会安装 SVN,因此不会加载 SVN 插件), MEF 抛出异常并且没有插件工作;我希望其他插件能够加载。

    [ImportMany(AllowRecomposition = true)]
    public IEnumerable<IVersionControl> RegisteredProviders { get; private set; }

相反,如果任何提供者未能自行构建,则RegisteredProviders 为空。

是否有一种简单的方法来配置 MEF 来实现这一点(报告异常但加载其他实例),还是我必须更改接口以延迟它们的初始化失败,直到 MEF 实例化对象之后?

【问题讨论】:

    标签: c# plugins mef


    【解决方案1】:

    这取决于抛出异常的确切时间。您可以通过将导入更改为以下内容来获得所需的内容:

    [ImportMany(AllowRecomposition = true)]
    public IEnumerable<Lazy<IVersionControl>> RegisteredProviders { get; private set; }
    

    这可能会延迟异常,直到您访问 Lazy 的 Value 属性。

    最好编写您的版本控制提供程序,以便即使所需的依赖项不存在,它们也可以成功加载,然后在它们上放置一个属性来检查依赖项是否存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多