使用配置数据填充MEF插件
本文关键字:MEF 插件 填充 置数据 配置 | 更新日期: 2023-09-27 17:57:49
我正在与MEF斗争,我遇到了一些问题——在我的应用程序中,我有一个单例类:
class Config: IConfig {
}
它存储应用程序配置数据-例如从XML文件、DB等加载
现在我有一些插件必须可以访问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通过添加PartCreationAttribute
来创建共享实例,就像一样
[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
{
...
}
我通常所做的是为所有插件创建一个通用的程序集,在这里我还放置了契约,在这种情况下,例如IConfigurationManager。
然后在引导程序上,我创建了一个CompositionBatch,我把配置管理器放在那里,因为每个插件都知道IConfigurationManager,所以我可以在需要的时候轻松导入它。