Question

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()
        {
        }
    }
}

Test Plugin Class Library

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

    }
}

Console Application

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

the DirectoryCatalog find tow Assembly IPlugin.dll and TestPlugin.dll and after Compose parts the myApp._Plugins is not null but its empty , i don't know where i am doing wrong!

Was it helpful?

Solution

You will need to use the InheritedExportAttribute instead of the ExportAttribute:

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

Note that this will only work for plugins that derive from BasePlugin. Other implementations of IPlugin will not be marked for export. To do this you will have to decorate the interface instead.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top