使用配置数据填充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);
    }
}

有更好的解决方案吗?

使用配置数据填充MEF插件

在应用程序生命周期的早期创建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,所以我可以在需要的时候轻松导入它。