熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

給IBuySpy構建一個PlugIn系統

2013-11-13 10:26:01  來源: .NET編程 

  PlugIn很COOL的特性下面將演示如何給我們的IBuySpy定制一個Page Start PlugIn這個PlugIn可以讓用戶自己來創建PlugIn嵌入到IBuySpy的Page Start PlugIn裡面在網站頁面載入的時候會執行用戶嵌入的PlugIn
  
   可我們為什麼要給IBuySpy創建PlugIn接口呢?我們要實現同樣的功能可以直接的修改它的代碼豈不是直接很多?原因IBuySpy只是用來演示PlugIn的你可以把同樣的技術應用到其他的WebForm甚至WinForm而它們可能並不會像IBuySpy一樣是免費的我們交付的產品裡面不會附上代碼如果我們提供了PlugIn的接口無疑會讓我們的產品更加具有擴展性何況很多功能可能可以直接作成PlugIn來嵌入到原有的系統中這個時候無需再改動原有的代碼再去編譯它
  
   構建IBuySpy的PlugIn所需的接口這些接口就是可以公開給用戶代碼的
  
   首先需要的是一個通用的IPlugIn接口所有具體的插件將實現這個接口
  
   namespace ASPNetPortalPlugIns {
  
   public interface IPlugIn {
   String Name {get;}
   String Version {get;}
   void DoAction(IPlugInArgs args);
   }
   }
  
   這個接口有三個成員
   Name屬性公開插件的名稱
   Version屬性公開插件的版本
   DoAction()方法執行插件要做的操作這個方法還有一個IPlugInArgs的參數需要傳遞給方法所參數可以通過它傳遞出去
  
   然後就是這個IPlugInArgs接口
  
   namespace ASPNetPortalPlugIns {
  
   public interface IPlugInArgs {
   SystemWebHttpContext Context {get;}
   Object Data {get;}
   }
   }
  
   它有兩個成員
   Context屬性一個HttpContext類型的對象如果我們要讓插件能夠在頁面上做些事不給它HttpContext肯定不行
   Data屬性一個Object類型的對象預留的什麼地方需要就什麼地方用上
  
   接著是一個接口集合類
  
   namespace ASPNetPortalPlugIns {
  
   public class PlugInCollection : CollectionBase {
  
   public Int Add(IPlugIn plugIn) {
   return thisListAdd(plugIn);
   }
  
   public IPlugIn this[Int index] {
   get {
   return (IPlugIn) thisList[index];
   }
   }
   }
   }
  
   很簡單明了用戶可能不止嵌入一個插件
  
   PlugIn也可以有很多類型比如我們這裡要實現的Page Start PlugIn是一個在頁面載入的時候可以讓嵌入的PlugIn執行的當然你也可以創建各種類型的PlugIn
  
   namespace ASPNetPortalPlugIns {
  
   public interface IPageStartPlugIn : IPlugIn {}
   }
  
   這個PlugIn接口不需要再做任何事直接繼承IPlugIn就可以了
  
   修改IBuySpy讓它支持執行PlugIn
  
   根據我們的需求我們創建一個實際的插件參數類這個類繼承自IPlugInArgs
  
   namespace ASPNetPortalPlugIns {
  
   public class PlugInArgs : IPlugInArgs {
   private SystemWebHttpContext _context;
   private Object _data;
  
   public PlugInArgs(SystemWebHttpContext context Object data) {
   _context = context;
   _data = data;
   }
  
   public SystemWebHttpContext Context {
   get {
   return _context;
   }
   }
  
   public Object Data {
   get {
   return _data;
   }
   }
   }
   }
  

  [NextPage]

  我們需要地方來標示用戶嵌入的PlugIn的列表我們放在nfig裡面的裡面我們加上一項來表示我們要添上的Page Start PlugIn 

    《ADD key=PageStartPlugIns value= /》
  
   value裡面可以寫入嵌入的PlugIn的列表格式像這樣Value = 插件一的類名 插件一的程序集名; 插件二的類名 插件二的程序集名
  
   然後我們構建一個PlugInHelper類來執行獲取PlugIn執行PlugIn的操作
  
   namespace ASPNetPortalPlugIns {
  
   public class PlugInHelper {
  
   private PlugInHelper() {}
  
   public static PlugInCollection GetPlugIns(String plugInType) {
   PlugInCollection plugIns = new PlugInCollection();
   String sPageStartPlugIns = SystemConfigurationConfigurationSettingsAppSettings[plugInType];
   if ((sPageStartPlugIns != null) && (sPageStartPlugIns != )) {
   String[] asPlugInStr = sPageStartPlugInsSplit(;); foreach(String plugInStr in asPlugInStr) {
   plugInsAdd( (IPageStartPlugIn) SystemActivatorCreateInstance(SystemTypeGetType(plugInStr)));
   }
   }
   return plugIns;
   }
  
   public static void ExecutePlugIns(PlugInCollection plugIns IPlugInArgs args) {
   foreach(IPlugIn plugIn in plugIns) {
   plugInDoAction(args);
   }
   }
   }
   }
  
   GetPlugIns()方法返回指定類型的PlugIn的列表返回類型是PlugInCollectionExecutePlugIns()用來執行參數中的PlugIn
  
   最後我們要把執行插件的代碼加入到頁面的執行隊列中為了在每個頁面開始的時候能夠執行用戶嵌入的Page Start Plug標准方法是在Globalasa裡面來實現更標准的方法是構建一個httpModule然後在這個httpModule中來執行這個PlugIn(關於構建自定義的httpModule辣椒是個中高手)我這裡就偷懶了因為IBuySpy幾乎所有的內容頁面都是DesktopDefaultaspx這個頁面中載入所以我們先在這個頁面裡面創建一個方法來執行插件
  
   private void PerformPlugIns() {
   PlugInCollection plugIns = PlugInHelperGetPlugIns(PageStartPlugIns);
   PlugInArgs args = new PlugInArgs(Context null);
   PlugInHelperExecutePlugIns(plugIns args);
   }
  
   第一句得到所有的Page Start PlugIn第二句創建一個傳遞給插件的PlugInArgs對象第三句調用PlugInHelperExecutePlugIns()來執行第一句得到的PlugIn隊列
  
   在DesktopDefaultaspx的Page_Init事件中調用上面的這個PerformPlugIns()方法就OK了
  
   演示如何創建一個Page Start PlugIn
  
   前面兩步已經讓IBuySpy可以嵌入用戶自定義的Page Start PlugIn了現在我們來做一個實際的PlugIn嵌進去
  
   啟動VS創建一個C#類庫項目引入IBuySpy的程序集Portaldll這是因為我們需要用到IBuySpy裡面的PlugIn相關的那些接口更好的方法是把IBuySpy中與PlugIn相關的公共接口放在一個單獨的程序集裡面
  
   namespace WelcomeMessage {
  
   public class ShowWelcome : ASPNetPortalPlugInsIPageStartPlugIn {
  
   public string Name {
   get {
   return Show Page Welcome Message;
   }
   }
  
   public string Version {
   get {
   return ;
   }
   }
  
   public void DoAction(IPlugInArgs args) {
   argsContextResponseWrite(<_script_>alert(Hello world!);); // 故意寫錯了不然
   }
   }
   }
  
   這個ShowWelcome類繼承自IPageStartPlugIn表示它是一個Page Start PlugIn用來具體執行操作的DoAction()方法只做了一件事從參數中得到頁面相關的HttpContext對象然後輸出一段字符以在頁面內容載入之前彈出一個Helloworld!的提示框
  
   然後我們修改IBuySpy的nfig裡面相關的那句設定
  
   《ADD value=WelcomeMessageShowWelcome WelcomeMessage key=PageStartPlugIns /》
  
   OK了編譯把生成的dll放到IBuySpy的bin目錄打開浏覽器浏覽IBuySpy網站你會看到每次載入頁面內容時都會彈出一個Helloworld!的提示框


From:http://tw.wingwit.com/Article/program/net/201311/13605.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.