我和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);
}
}
有更好的解决方案吗?
答案 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,而不是我可以随时轻松导入它。