Dav*_*ave 5 .net plugins mef inversion-of-control
到目前为止,MEF最大的问题是,当我在插件加载器包装器中编写部件时,在发现其中一个程序集的导入解决问题时完全加载.理想情况下,我希望ComposeParts能够展示某种"忽略和继续"行为,因为理想的用户体验需要加载尽可能多的插件,并且只需在特定插件无法加载时记录事件.我无法在任何地方的文档中找到有关此信息.
如果您对如何解决这个问题有任何其他建议,我正在听!
Wes*_*ard 10
Wim的例子有基本的想法,但不是直接拉动容器我建议你做一个像这样的懒惰ImportMany:
[Export]
public class MyApplication
{
[ImportMany(typeof(IPlugin))]
public IEnumerable<Lazy<IPlugin>> Plugins { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你可以逐个初始化插件并从中捕获任何错误,如:
void InitializePlugins()
{
foreach (Lazy<IPlugin> plugin in Plugins)
{
try
{
plugin.Value.Initialize();
}
catch (CompositionException e)
{
// Handle the error accordingly
}
}
}
Run Code Online (Sandbox Code Playgroud)
直到你拉上.Value才会创建实际的插件.第一次是值,如果插件在构造函数或导入的属性设置器中有错误,则会发生错误.另请注意,我抓住了CompositionException,如果插件出错了,它将从.Value调用中产生.