用配置数据填充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,因此我可以在需要时轻松导入它。