MEF ImportMany简单的插件

时间:2014-02-07 09:00:44

标签: mef

IPlugin Calss Library

namespace IPlugin
{
    public interface IPlugin
    {
        string Name { get; set; }
        void Start();
        void Stop();
    }

    [Export(typeof(IPlugin))]
    public abstract class BasePlugin:IPlugin
    {
        private string _name;
        public BasePlugin()
        {
            Name = "Base Plugin";
        }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public virtual void Start()
        {
            fnDowWork();
        }

        protected abstract void fnDowWork();

        public virtual void Stop()
        {
        }
    }
}

测试插件类库

namespace TestPlugin
{
    public class TestPlugin:IPlugin.BasePlugin
    {
        public TestPlugin()
        {
            Name = "Test Plugin";
        }
        protected override void fnDowWork()
        {
            Console.WriteLine("Do Work !");
        }

    }
}

控制台应用

class Program
{
    static void Main(string[] args)
    {
        var app = new MyApp();

        foreach (var p in app._Plugins)
        {
            p.Start();
        }
    }
}


public class MyApp
{
    [ImportMany(typeof(IPlugin.IPlugin))]
    public IEnumerable<IPlugin.IPlugin> _Plugins;

    public string _PluginFolder { get; set; }

    public string _StartupPath { get; set; }

    public MyApp()
    {
        _StartupPath = Environment.CurrentDirectory;
        var pluginFolderName = System.Configuration.ConfigurationManager.AppSettings["PluginFolder"];
        _PluginFolder = System.IO.Path.Combine(_StartupPath, pluginFolderName);

        InitializeMEF();
    }

    private void InitializeMEF()
    {
        var dirCatalog = new DirectoryCatalog(_PluginFolder, "*.dll");

        CompositionContainer container = new CompositionContainer(dirCatalog);

        container.ComposeParts(this);
    }
}

DirectoryCatalog找到程序集IPlugin.dll和TestPlugin.dll以及Compose部件之后 myApp._Plugins不是null但它是空的,我不知道我在哪里做错了!

1 个答案:

答案 0 :(得分:1)

您需要使用InheritedExportAttribute代替ExportAttribute

[InheritedExport(typeof(IPlugin))]
public abstract class BasePlugin:IPlugin

请注意,这仅适用于派生自BasePlugin的插件。 IPlugin的其他实现不会标记为导出。要做到这一点,你必须改为装饰界面。