Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
健壮的C#插件系统_C#_Plugins_Mef - Fatal编程技术网

健壮的C#插件系统

健壮的C#插件系统,c#,plugins,mef,C#,Plugins,Mef,我正在编写一个工具,它可以与多个版本控制系统(subversion或clearcase)通信,并具有各种可以插入其中的实用程序。我考虑使用MEF加载版本控制提供程序和实用程序,这两个提供程序都定义了接口 我已经开始使用MEF了。但是如果加载任何插件失败(在我的客户机的一半机器上,ClearCase COM绑定将不存在,因此加载将失败,在另一半机器上,SVN将不被安装,因此SVN插件将不加载),尽管如此,MEF抛出一个异常,并且没有插件工作;我希望其余的插件都能加载 [ImportMany

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

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

    [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属性

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