健壮的C#插件系统
我正在编写一个工具,它可以与多个版本控制系统(subversion或clearcase)通信,并具有各种可以插入其中的实用程序。我考虑使用MEF加载版本控制提供程序和实用程序,这两个提供程序都定义了接口 我已经开始使用MEF了。但是如果加载任何插件失败(在我的客户机的一半机器上,ClearCase COM绑定将不存在,因此加载将失败,在另一半机器上,SVN将不被安装,因此SVN插件将不加载),尽管如此,MEF抛出一个异常,并且没有插件工作;我希望其余的插件都能加载健壮的C#插件系统,c#,plugins,mef,C#,Plugins,Mef,我正在编写一个工具,它可以与多个版本控制系统(subversion或clearcase)通信,并具有各种可以插入其中的实用程序。我考虑使用MEF加载版本控制提供程序和实用程序,这两个提供程序都定义了接口 我已经开始使用MEF了。但是如果加载任何插件失败(在我的客户机的一半机器上,ClearCase COM绑定将不存在,因此加载将失败,在另一半机器上,SVN将不被安装,因此SVN插件将不加载),尽管如此,MEF抛出一个异常,并且没有插件工作;我希望其余的插件都能加载 [ImportMany
[ImportMany(AllowRecomposition = true)]
public IEnumerable<IVersionControl> RegisteredProviders { get; private set; }
[ImportMany(AllowRecomposition=true)]
公共IEnumerable RegisteredProviders{get;private set;}
相反,如果任何提供程序无法自行构造,则RegisteredProviders
为空
有没有一种简单的方法可以配置MEF来实现这一点(报告异常但加载其他实例),或者我必须更改接口以延迟初始化失败,直到MEF实例化对象之后?这取决于异常的确切引发时间。通过将导入更改为以下内容,您可以获得所需内容:
[ImportMany(AllowRecomposition = true)]
public IEnumerable<Lazy<IVersionControl>> RegisteredProviders { get; private set; }
[ImportMany(AllowRecomposition=true)]
公共IEnumerable RegisteredProviders{get;private set;}
这可能会延迟异常,直到您访问Lazy的Value属性
最好编写版本控制提供程序,这样即使所需的依赖项不存在,它们也可以成功加载,然后在其上放置一个属性,该属性将检查依赖项是否存在