给IBuySpy构建一个PlugIn系统
点击次数:13 次 发布日期:2008-11-27 00:02:13 作者:源代码网
|
源代码网推荐 源代码网推荐 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]; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 很简单明了。用户可能不止嵌入一个插件。 源代码网推荐 源代码网推荐 PlugIn也可以有很多类型,比如我们这里要实现的Page Start PlugIn,是一个在页面载入的时候可以让嵌入的PlugIn执行的。当然你也可以创建各种类型的PlugIn。 源代码网推荐 源代码网推荐 namespace ASPNetPortal.PlugIns { 源代码网推荐 源代码网推荐 public interface IPageStartPlugIn : IPlugIn {} 源代码网推荐 } 源代码网推荐 源代码网推荐 这个PlugIn接口不需要再做任何事,直接继承IPlugIn就可以了。 源代码网推荐 源代码网推荐 2、修改IBuySpy,让它支持执行PlugIn: 源代码网推荐 源代码网推荐 根据我们的需求,我们创建一个实际的插件参数类,这个类继承自IPlugInArgs: 源代码网推荐 源代码网推荐 namespace ASPNetPortal.PlugIns { 源代码网推荐 源代码网推荐 public class PlugInArgs : IPlugInArgs { 源代码网推荐 private System.Web.HttpContext _context; 源代码网推荐 private Object _data; 源代码网推荐 源代码网推荐 public PlugInArgs(System.Web.HttpContext context, Object data) { 源代码网推荐 _context = context; 源代码网推荐 _data = data; 源代码网推荐 } 源代码网推荐 源代码网推荐 public System.Web.HttpContext Context { 源代码网推荐 get { 源代码网推荐 return _context; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 public Object Data { 源代码网推荐 get { 源代码网推荐 return _data; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 我们需要地方来标示用户嵌入的PlugIn的列表,我们放在web.config里面的里面,我们加上一项,来表示我们要添上的Page Start PlugIn: 源代码网推荐 源代码网推荐 《ADD key="PageStartPlugIns" value="" /》 源代码网推荐 源代码网推荐 value里面可以写入嵌入的PlugIn的列表,格式像这样:Value = "插件一的类名, 插件一的程序集名; 插件二的类名, 插件二的程序集名" 源代码网推荐 源代码网推荐 然后,我们构建一个PlugInHelper类,来执行获取PlugIn、执行PlugIn的操作: 源代码网推荐 源代码网推荐 namespace ASPNetPortal.PlugIns { 源代码网推荐 源代码网推荐 public class PlugInHelper { 源代码网推荐 源代码网推荐 private PlugInHelper() {} 源代码网推荐 源代码网推荐 public static PlugInCollection GetPlugIns(String plugInType) { 源代码网推荐 PlugInCollection plugIns = new PlugInCollection(); 源代码网推荐 String sPageStartPlugIns = System.Configuration.ConfigurationSettings.AppSettings[plugInType]; 源代码网推荐 if ((sPageStartPlugIns != null) && (sPageStartPlugIns != "")) { 源代码网推荐 String[] asPlugInStr = sPageStartPlugIns.Split(";"); foreach(String plugInStr in asPlugInStr) { 源代码网推荐 plugIns.Add( (IPageStartPlugIn) System.Activator.CreateInstance(System.Type.GetType(plugInStr))); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 return plugIns; 源代码网推荐 } 源代码网推荐 源代码网推荐 public static void ExecutePlugIns(PlugInCollection plugIns, IPlugInArgs args) { 源代码网推荐 foreach(IPlugIn plugIn in plugIns) { 源代码网推荐 plugIn.DoAction(args); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 GetPlugIns()方法返回指定类型的PlugIn的列表,返回类型是PlugInCollection,ExecutePlugIns()用来执行参数中的PlugIn。 源代码网推荐 源代码网推荐 最后,我们要把执行插件的代码加入到页面的执行队列中。为了在每个页面开始的时候能够执行用户嵌入的Page Start Plug,标准方法是在Global.asa里面来实现,更标准的方法是构建一个httpModule,然后在这个httpModule中来执行这个PlugIn(关于构建自定义的httpModule,辣椒是个中高手)。我这里就偷懒了,因为IBuySpy几乎所有的内容页面都是DesktopDefault.aspx这个页面中载入,所以我们先在这个页面里面创建一个方法来执行插件: 源代码网推荐 源代码网推荐 private void PerformPlugIns() { 源代码网推荐 PlugInCollection plugIns = PlugInHelper.GetPlugIns("PageStartPlugIns"); 源代码网推荐 PlugInArgs args = new PlugInArgs(Context, null); 源代码网推荐 PlugInHelper.ExecutePlugIns(plugIns, args); 源代码网推荐 } 源代码网推荐 源代码网推荐 第一句得到所有的Page Start PlugIn,第二句创建一个传递给插件的PlugInArgs对象,第三句调用PlugInHelper.ExecutePlugIns()来执行第一句得到的PlugIn队列。 源代码网推荐 源代码网推荐 在DesktopDefault.aspx的Page_Init事件中调用上面的这个PerformPlugIns()方法就OK了。 源代码网推荐 源代码网推荐 3、演示如何创建一个Page Start PlugIn: 源代码网推荐 源代码网推荐 前面两步已经让IBuySpy可以嵌入用户自定义的Page Start PlugIn了,现在我们来做一个实际的PlugIn嵌进去。 源代码网推荐 源代码网推荐 启动VS,创建一个“C#类库”项目,引入IBuySpy的程序集Portal.dll,这是因为我们需要用到IBuySpy里面的PlugIn相关的那些接口,更好的方法是把IBuySpy中与PlugIn相关的公共接口放在一个单独的程序集里面。 源代码网推荐 源代码网推荐 namespace WelcomeMessage { 源代码网推荐 源代码网推荐 public class ShowWelcome : ASPNetPortal.PlugIns.IPageStartPlugIn { 源代码网推荐 源代码网推荐 public string Name { 源代码网推荐 get { 源代码网推荐 return "Show Page Welcome Message"; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 public string Version { 源代码网推荐 get { 源代码网推荐 return "1.0.0.1"; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 public void DoAction(IPlugInArgs args) { 源代码网推荐 args.Context.Response.Write(“<_script_>alert(‘Hello, world!’);”); // 故意写错了,不然... 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 这个ShowWelcome类继承自IPageStartPlugIn,表示它是一个Page Start PlugIn,用来具体执行操作的DoAction()方法只做了一件事,从参数中得到页面相关的HttpContext对象,然后输出一段字符以在页面内容载入之前弹出一个“Hello,world!”的提示框。 源代码网推荐 源代码网推荐 然后我们修改IBuySpy的web.config里面相关的那句设定: 源代码网推荐 源代码网推荐 《ADD value="WelcomeMessage.ShowWelcome, WelcomeMessage" key="PageStartPlugIns" /》 源代码网推荐 源代码网推荐 OK了,编译,把生成的dll放到IBuySpy的bin目录,打开浏览器浏览IBuySpy网站,你会看到每次载入页面内容时,都会弹出一个“Hello,world!”的提示框。 源代码网推荐 源代码网推荐 kaneboy"s blog: http://blog.joycode.com/kaneboy/ 源代码网推荐 源代码网供稿. |
