使用配置数据填充MEF插件

时间:2011-05-26 17:32:25

标签: c# mef

我和MEF打架并且我遇到了一些问题 - 在我的App中我有单身课程:

class Config: IConfig {
}

存储App配置数据 - 例如从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);
    }
}

有更好的解决方案吗?

4 个答案:

答案 0 :(得分:2)

如何在应用程序的生命周期早期创建Config类的实例并从那里导出?

然后可以在构造函数中导入或作为属性导入。

答案 1 :(得分:2)

MEF的方法是不通过实例字段访问配置管理器,而是让MEF通过添加PartCreationAttribute来创建共享实例

[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IConfig))]
class Config: IConfig {}

并在插件上添加适当的导入。只要在进行合成时配置类型在目录中,就应该在插件上设置它。

答案 2 :(得分:2)

通常你会做这样的事情;在插件程序集中:

[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
{
   ...
}

答案 3 :(得分:1)

我通常做的是为所有插件配备一个通用程序集,我也提供合同,在这种情况下为ex。 IConfigurationManager。

然后在引导程序中,我创建了一个 CompositionBatch ,其中我放置了配置管理器,因为每个插件都知道IConfigurationManager,而不是我可以随时轻松导入它。