Plugin是一種相當靈活的可擴充、模塊化機制,微軟的Application Block不少采用了Plugin結構,本文討論Plugin在C#中的一種實踐。
Plugin是基於統一的接口,在C#中采用Reflection機制產生實現IPlugin的對象。假定接口為IPlugin,以下代碼塊示意動態產生IPlugin對象的代碼段,其中dllName是實現IPlugin接口類的dll文件名:
public IPlugin LoadPlugin(string dllName)
{
Assembly asm = AppDomain.CurrentDomain.Load(dllName);
foreach(Type t in asm.GetTypes()) {
foreach(Type iface in t.GetInterfaces()) {
if(iface.Equals(typeof(IPlugin))) {
return (System.Activator.CreateInstance(t)) as IPlugin;
}
}
}
return null;
}
Java也有Reflection機制,實現Plugin也很簡單,大致是(IPlugin)Class.forName(className).newInstance()的樣子。C++由於Reflection機制,可以采用DLL模擬,在DLL中export一個全局函數和interface,該全局函數返回實現了接口的對象的指針。
微軟有關於Provider Pattern的文章,文中提供了另一種C#可以帶參數的實例化方法。