MEF插件没有来自主机的数据

问题描述

| 我正在尝试将配置数据从主机放到插件上,但是我总是在插件上得到null。我负责插件代码如下: 形成:
public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();

        DataStorage.Instance.LoadModes();
        DataStorage.Instance.ActiveMode = \"aaa\";
        DataStorage.Instance.RulesFile = \"bbb\";
        DataStorage.Instance.SetProjectName(\"cccc\");
        DataStorage.Instance.LoadRules();
        DataStorage.Instance.Loadplugins();

    }
}
数据存储:
[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(ConfigStorage))]  
public class DataStorage: ConfigStorage
{

    //fields and properties here

    public string ActiveMode;

    [ImportMany(typeof (IAPlugin))]
    public IEnumerable<Lazy<IAPlugin,IAPluginData>> aPlugins;

    [ImportMany(typeof (IBPlugin))]
    public IEnumerable<Lazy<IBPlugin,IBPluginData>> bPlugins;

    private CompositionContainer _container;

    private static readonly DataStorage instance = new DataStorage();

    static DataStorage()
    {
    }

    private DataStorage()
    {
            Init();
    }


    public static DataStorage Instance
    {
        get { return instance; }
    }


    private void Init()
    {
        //code here
    }

    public void Loadplugins()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(ConfigStorage).Assembly));
        catalog.Catalogs.Add(new DirectoryCatalog(Settings.Default.GetPathFor(\"Plugins\")));

        _container = new CompositionContainer(catalog);

        try
        {
            _container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }
    }
}
ConfigStorage:
public abstract class ConfigStorage
{

    public string RulesFile;
    public string ActiveMode;
//properties and methods
}
插入:
[Export(typeof (IAPlugin))]
[ExportMetadata(\"Name\",\"myNameIsBond\")]
public class myNameIsBond :  IAPlugin
{

     protected readonly ConfigStorage configStorage;

     [ImportingConstructor]
     public myNameIsBond (ConfigStorage configStorage)
    {
        if (configStorage == null)
            throw new ArgumentNullException(\"configStorage\");
        this.configStorage = configStorage;
    }


    public string DoStep(string url)
    {
        Console.WriteLine(configStorage.ActiveMode); //this is null - it should be \"aaa\"
        return url;
    }

}
当我运行plugin.Value.DoStep(\“ sth \”); Console.WriteLine(configStorage.ActiveMode);总是打印null-在调试时:configStorage中的所有字段均为null。我做错了什么?如何将DataStorage实例放入插件?     

解决方法

        我认为问题在于ConfigStorage导出显示在目录中,因此导入对目录创建的版本(而不是已配置的单例)感到满意。尝试将PartNotDiscoverableAttribute放在DataStorage类上。 顺便说一句,您的DataStorage构造函数是私有的,但是看起来目录仍然可以创建它的单独版本,因为该构造函数是通过反射调用的。     ,        我通常根本不使用实例变量,而只是让MEF创建单例,但是如果您真的想拥有实例属性,则可以执行以下操作
// note that there is no export attribute here
public class DataStorage: ConfigStorage
{
    [Export(typeof(ConfigStorage))] 
    public static DataStorage instance { get; private set; }
}
这样,MEF将导出您的单例实例,而不是创建一个新对象。