2011-05-26 52 views
2

我與MEF戰鬥,我停在了一些問題 - 在我的應用我有單例類:填充MEF插件與配置數據

class Config: IConfig { 
} 

存儲應用程序配置數據 - 加載例如從XML文件, DB等

現在我有一些插件必須能夠訪問配置 - 所以我想知道什麼是最好的解決方案將配置傳遞給插件?

我現在的解決方案是:

[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); 
    } 
} 

任何更好的解決方案?

回答

2

如何在應用程序生命週期的早期階段創建Config類的實例並從那裏導出?

然後可以在構造函數或屬性中導入。

1

我通常做的是所有插件都有一個通用程序集,在這裏我也提供了契約, IConfigurationManager。

然後在引導程序,我創建了一個CompositionBatch這裏我把那裏的配置管理和因爲每個插件都知道IConfigurationManager比我可以很容易地導入它,每當我需要它。

+0

你有關於這個的例子嗎? – Luke 2012-12-12 14:17:11

2

的MEF辦法做到這一點,是不是通過實例字段通過添加PartCreationAttribute像這樣

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

並添加適當的導入訪問配置管理器,而是讓MEF創建共享實例在你的插件上。只要配置類型在目錄中時,你應該在你的插件上進行設置。

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