[转载]更灵活,更易维护的WebHandler之通用webHandler编码方案(2) – 刘铭.net-OPS.cc – 博客园.
上一篇:更灵活,更易维护的WebHandler之通用webHandler编码方案(1) 中介绍了在同一个程序集中使用webHandler执行类的方法,
但在多数情况下,我们会将WebHandler封装进一个单独的动态链接库,我们需要将引用WebHandler DLL的程序集或程序集中的任意一个类的Type做为参数传递给WebHandler,
这样就可以在WebHandler中利用反射调用引用WebHandler类库的程序集中的代码!
实现代码如下:
16 |
using System.Reflection; |
17 |
using System.Collections.Generic; |
19 |
public abstract class ExecuteHandler : IHttpHandler |
22 |
protected static Type _type; |
23 |
#region IHttpHandler 成员 |
24 |
public bool IsReusable{ get ; set ; } |
26 |
public void ProcessRequest(HttpContext context) |
28 |
string cmd=context.Request[ "cmd" ].Replace( "+" , " " ); |
30 |
string [] args = cmd.Split( ',' ); |
34 |
Assembly ass = Assembly.GetAssembly(_type); |
35 |
object obj = ass.CreateInstance(_type.Namespace+ "." +args[0], true ); |
38 |
Type type=obj.GetType(); |
41 |
object [] attrs= type.GetCustomAttributes( typeof (WebExecuteAttribute), false ); |
42 |
WebExecuteAttribute attr =attrs.Length>0?attrs[0] as WebExecuteAttribute: null ; |
43 |
if (attr == null ) { context.Response.Write( "此模块不允许被执行!" ); return ; } |
46 |
MethodInfo method =type.GetMethod(args[1],BindingFlags.Instance|BindingFlags.Public|BindingFlags.IgnoreCase); |
47 |
object returnObj=method.GetParameters() != null ?method.Invoke(obj,cmd.Substring(args[0].Length + args[1].Length + 2).Split( ',' )) |
48 |
:method.Invoke(obj, null ); |
51 |
if (method.ReturnType == typeof ( string ) ||obj is ValueType) |
52 |
context.Response.Write(returnObj.ToString()); |
我们需在继承ExecuteHandler的类的静态构造函数中对_type赋值:
01 |
namespace AtNet.Web.Tools |
04 |
using System.Reflection; |
06 |
public class WebHandler:AtNet.Web.ExecuteHandler |
10 |
_type = typeof (WebHandler); |
这样我们就能在将ExecuteHandler分离出来,被别的项目所引用