話說公元2003年12月17日,MSDN Library網站上悄無聲息的多了一篇文章,介紹了關於構建一個PlugIn Framework的一些基礎知識,於是,有了這篇隨筆…
PlugIn,很COOL的特性,下面將演示如何給我們的IBuySpy定制一個Page Start PlugIn,這個PlugIn可以讓用戶自己來創建PlugIn,嵌入到IBuySpy的Page Start PlugIn裡面,在網站頁面載入的時候,會執行用戶嵌入的PlugIn。
可我們為什麼要給IBuySpy創建PlugIn接口呢?我們要實現同樣的功能,可以直接的修改它的代碼,豈不是直接很多?原因:IBuySpy只是用來演示PlugIn的,你可以把同樣的技術應用到其他的WebForm甚至WinForm,而它們可能並不會像IBuySpy一樣是免費的,我們交付的產品裡面不會附上代碼,如果我們提供了PlugIn的接口,無疑會讓我們的產品更加具有擴展性。何況很多功能可能可以直接作成PlugIn來嵌入到原有的系統中,這個時候無需再改動原有的代碼,再去編譯它。
1、構建IBuySpy的PlugIn所需的接口,這些接口就是可以公開給用戶代碼的:
首先需要的是一個通用的IPlugIn接口,所有具體的插件將實現這個接口:
namespace ASPNetPortal.PlugIns {
public interface IPlugIn {
String Name {get;}
String Version {get;}
void DoAction(IPlugInArgs args);
}
}
這個接口有三個成員:
Name屬性,公開插件的名稱
Version屬性,公開插件的版本
DoAction()方法,執行插件要做的操作,這個方法還有一個IPlugInArgs的參數,需要傳遞給方法所參數可以通過它傳遞出去。
然後就是這個IPlugInArgs接口:
namespace ASPNetPortal.PlugIns {
public interface IPlugInArgs {
System.Web.HttpContext Context {get;}
Object Data {get;}
}
}
它有兩個成員:
Context屬性,一個HttpContext類型的對象,如果我們要讓插件能夠在頁面上做些事,不給它HttpContext肯定不行。
Data屬性,一個Object類型的對象,預留的,什麼地方需要就什麼地方用上。
接著是一個接口集合類:
namespace ASPNetPortal.PlugIns {
public class PlugInCollection : CollectionBase {
public Int32 Add(IPlugIn plugIn) {
return this.List.Add(plugIn);
}
public IPlugIn this[Int32 index] {
get {
return (IPlugIn) this.List[index];
}
}
}
}
很簡單明了。用戶可能不止嵌入一個插件。