2016-11-11 31 views
0

我有一個由Prism和MEF構建的應用程序。 我有一些模塊(在相同的解決方案內定義),我加載和一切工作正常。使用MEF允許用戶添加自定義插件,運行方法並更改數據點的集合

但是現在我想允許用戶添加他們自己的插件(基本上這些插件應該改變數據點的集合) - 換句話說,用戶創建一個算法(插件)來改變這些生活的數據點在ViewModel中。

我需要定義某種「合同」的用戶需要創建一個新的插件時ophold。我將如何做到這一點?

插件應該是一個/插件文件夾中的單個.dll和應在運行時加載,一個ListView應在包含各插件一個用戶控件的圖來填充。

回答

2

MEF將使這項工作非常輕鬆順利。

對於插件:

  1. 創建你的插件A接口。 它並不真正需要非常複雜的,雖然你可以用它來迫使開發人員添加一些說明或版本信息,當然接收您的收藏把它轉換的方法。

  2. 插件應該使用ExportAttribute讓MEF知道它們。

    [Export(typeof(IPlugin))] 
    public class Plugin : IPlugin 
    

這應該是enougth這裏。

對於應用程序:

  1. 聲明,將收到的插件,MEF能找到的名單集合,不要忘了ImportManyAttribute。

    [ImportMany(typeof(IPlugin))] 
    public IEnumerable<IPlugin> Plugins{ get; set; } 
    
  2. 創建您的目錄和容器。 在我顯示的代碼上添加兩個目錄,也許你不需要它,只是爲了讓你知道你可以有更多的源代碼。

    AggregateCatalog catalog = new AggregateCatalog(); 
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly())); 
    catalog.Catalogs.Add(new DirectoryCatalog("plugins")); 
    var container = new CompositionContainer(catalog); 
    
  3. 做到了魔法。 當然this應與ImportManyAttribute的對象。

    container.ComposeParts(this); 
    
相關問題