2015-09-02 85 views
0

我已經實現了一個基於C# with MEF的非常小的插件系統。問題是,我的插件沒有實例化。在Aggregate-Catalog我可以看到my plugin listed。但是,在我編寫這些部分之後,插件列表中沒有插件,我做錯了什麼?基於MEF的插件系統不能插件我的插件

這裏是我的代碼片段:

插件-裝載機:

[ImportMany(typeof(IFetchService))] 
    private IFetchService[] _pluginList; 
    private AggregateCatalog _pluginCatalog; 
    private const string pluginPathKey = "PluginPath"; 
    ... 

    public PluginManager(ApplicationContext context) 
    { 
     var dirCatalog = new DirectoryCatalog(ConfigurationManager.AppSettings[pluginPathKey]); 
     //Here's my plugin listed... 
     _pluginCatalog = new AggregateCatalog(dirCatalog); 

     var compositionContainer = new CompositionContainer(_pluginCatalog); 
     compositionContainer.ComposeParts(this); 
    } 
    ... 

這裏,插件本身:

[Export(typeof(IFetchService))] 
public class MySamplePlugin : IFetchService 
{ 
    public MySamplePlugin() 
    { 
     Console.WriteLine("Plugin entered"); 
    } 
    ... 
} 
+0

我複製你的代碼中的控制檯應用程序和它的工作沒有問題。 –

回答

0

測試工作的樣品。

用PluginNameSpace命名空間內的代碼編譯類庫,並將其放置到將放在控制檯應用程序exe文件夾內的'Test'文件夾中。

using System; 
using System.ComponentModel.Composition; 
using System.ComponentModel.Composition.Hosting; 
using System.IO; 
using System.Reflection; 
using ConsoleApplication; 

namespace ConsoleApplication 
{ 
    public interface IFetchService 
    { 
     void Write(); 
    } 

    class PluginManager 
    { 
     [ImportMany(typeof(IFetchService))] 
     public IFetchService[] PluginList; 

     public PluginManager() 
     { 
      var dirCatalog = new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Test"); 

      var pluginCatalog = new AggregateCatalog(dirCatalog); 
      var compositionContainer = new CompositionContainer(pluginCatalog); 
      compositionContainer.ComposeParts(this); 
     } 
    } 

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

      foreach (var fetchService in pluginManager.PluginList) 
      { 
       fetchService.Write(); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 

// Separate class library 
namespace PluginNameSpace 
{ 
    [Export(typeof(IFetchService))] 
    public class MySamplePlugin : IFetchService 
    { 
     public void Write() 
     { 
      Console.WriteLine("Plugin entered"); 
     } 
    } 
} 
+0

您是否看過我的文章?在這篇文章中,我說過,我的插件已列在AggregateCatalog中。只有ComposeContainer不能編寫這些部分。我的插件是一個單獨的庫。我已經通過myselfe解決了這個問題。接口IFetchService應該由自己的庫分開。這個庫應該從雙方引用。現在我的插件被加載並實例化。 – user3149497