2014-02-07 1 views
0

IPlugin Calss БиблиотекаMEF ImportMany простой плагин

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 Класс Console Application

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 и после компоновки частей myApp._Plugins не является нулевым, но его пустым, я не знаю, где я делаю неправильно!

ответ

1

Вам нужно будет использовать InheritedExportAttribute вместо ExportAttribute:

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

Обратите внимание, что это будет работать только для плагинов, которые вытекают из BasePlugin. Другие реализации IPlugin не будут отмечены для экспорта. Для этого вам придется украшать интерфейс.