如何解决用配置数据填充MEF插件
| 我正在与MEF作战,但我在某些问题上停下来-在我的App中,我有单身人士课:class Config: IConfig {
}
存储应用程序配置数据-例如从XML文件,数据库等加载
现在,我有一些必须可以访问Config的插件-所以我想知道将Config传递给插件的最佳解决方案是什么?
我现在的解决方案是:
[ImportMany(typeof (IFieldPlugin))]
public IEnumerable<Lazy<IFieldPlugin,IFieldPluginData>> fieldPlugins;
foreach (var plugin in PluginsStorage.Instance.fieldPlugins)
{
if (plugin.Metadata.Name.Equals(field.Plugin))
{
if(!plugin.IsValueCreated) {
plugin.Value.Config = Config.Instance;
}
result = plugin.Value.DoStep(this,url);
}
}
有更好的解决方案吗?
解决方法
在应用程序生命周期的早期创建Config类的实例并从中导出该怎么办?
然后可以导入构造函数或作为属性。
,MEF做到这一点的方法是,不通过实例字段访问配置管理器,而是让MEF通过添加“ 2”来创建共享实例,如下所示
[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IConfig))]
class Config: IConfig {}
并在插件上添加适当的导入。只要在进行合成时配置类型在目录中,就应该在插件上进行设置。
,通常,您会这样做。在插件程序集中:
[Export(typeof(IPlugin))]
public class MyPlugin : IPlugin
{
private readonly IConfig config;
[ImportingConstructor]
public MyPlugin(IConfig config)
{
if (config == null)
throw new ArgumentNullException(\"config\");
this.config = config;
}
}
在核心应用程序程序集之一中:
[Export(typeof(IConfig))]
public class Config : IConfig
{
...
}
,我通常要做的是为所有我有合同的插件建立一个通用组件,在本例中为ex。 IConfigurationManager。
然后在引导程序上,我创建一个CompositionBatch,在其中放置配置管理器,并且由于每个插件都了解IConfigurationManager,因此我可以在需要时轻松导入它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。