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