代码之家  ›  专栏  ›  技术社区  ›  Pete Kirkham

强大的C插件系统

  •  1
  • Pete Kirkham  · 技术社区  · 14 年前

    我正在编写一个工具,它可以与多个版本控制系统(Subversion或ClearCase)进行通信,并具有可以插入其中的各种实用程序。尽管我使用MEF加载版本控制提供程序和实用程序,但这两个提供程序都定义了接口。

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

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

    相反,如果任何提供者未能构建自己,那么 RegisteredProviders 是空的。

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   Daniel Plaisted    14 年前

    这完全取决于何时抛出异常。您可以通过将导入更改为:

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

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

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