2014-10-30 56 views
-2

我是MEF上的新手,我試圖使用MEF framewok爲我的C#應用​​程序添加插件可擴展性。如何基於Mef插件類創建變量

我正在從數據庫下載插件並通過byte []數據加載。

this.PluginCatalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load(RawData))); 

在嘗試使用基類的插件之前,所有東西都像魔術一樣工作。

我的一個插件正在尋找這樣的:

using System; 
using System.Net; 
using System.ComponentModel; 

using System.ComponentModel.Composition; 
using System.Reflection; 

using PluginCommon; 

namespace Plugins 
{ 
    [Export("Plugin", typeof(IPlugin))] 
    [PluginMetadata("DownloadManager", "1.0")] 
    [PartCreationPolicy(CreationPolicy.NonShared)] 

    public class DownloadManager : INGPlugin 
    { 
     WebClient Client = new WebClient(); 
     public string _text = "qwert"; 

     public AsyncCompletedEventHandler dc { get; set; } 
     public DownloadProgressChangedEventHandler pc { get; set; } 

     public void Download(string url, string path) 
     { 
      Client.DownloadProgressChanged += this.pc; 
      Client.DownloadFileCompleted += this.dc; 
      Client.DownloadFileAsync(new Uri(url), path); 
     } 
    } 
} 

使用這個插件我需要創建下載管理器的變量類型化。我的插件大部分與本示例相同。我需要創建具有相同類型插件的插件實例。

我想我正在使用一個錯誤的接近,有人可以給我一些例子嗎?

最好的問候,

回答

0

MEF的全部意義在於從主機代碼分離的插件/服務(從海誓山盟)。

如果您需要直接與插件類型進行交互,您沒有從MEF中獲得任何好處。

你可能想公開一個基地IDownloadManager接口和導出,但是你仍然需要決定MEF是否會有用。

+0

謝謝你的快速回答。爲了方便,我是全新的插件系統,我不必使用mef,如果我可以添加插件支持到我的應用程序。插件系統是必需的,因爲我從數據庫獲得授權的部分,這種方式讓我只更新一個插件或添加新的功能,而無需更新整個應用程序。如果我爲每個插件聲明一個接口,這可能仍然讓我更新插件,但那時我不能添加一個方法到同一個插件或我不能添加新的插件。 – Xhays 2014-10-30 20:04:44

+0

@Xhays:如果你想從應用代碼中分離插件代碼,你需要有一個穩定的接口。不管你做什麼,你都不能添加一個方法,因爲現有的插件不會擁有它。歡迎來到版本控制的困難世界。 – SLaks 2014-10-30 20:08:10

+0

謝謝你的建議。當我嘗試在Visual Studio中快速觀看「((Plugins.DownloadManager)PController.GetPlugin(」DownloadManager「)))」。 PController.GetPlugin返回部分的IPlugin。它讓我檢查插件中的所有變量和方法。 (插件DLL沒有被引用到應用程序)。但是同樣的命令行在我的代碼中不起作用,即使我試圖設置插件的參照。你知道什麼樣的機制使用vs檢查插件方法嗎? – Xhays 2014-10-30 20:13:43