好久没有摸代码了,有点生了,对于现在远洋这个信息项目的整体技术架构不是太懂,对我来说有点难度,今天主要分析调试跟踪了一下打开表单创立工作流这里涉及到的代码,在跟踪的时候遇到了一些东西不是太懂,查:
主要是以下对象
IHttpHandler:引用地址http://www.cnblogs.com/stwyhm/archive/2006/08/09/471765.html
概述
HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。
IHttpHandler是什么
IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。
IHttpHandler如何处理HTTP请求
当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。
对于ASPX页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。所谓一个HttpHandlerFactory,所谓一个HttpHandlerFactory,是指当一个HTTP请求到达这个HttpHandler Factory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。
一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。
Delegate,Action,Func,匿名方法,匿名委托,事件:http://www.cnblogs.com/yjmyzz/archive/2009/11/23/1608818.html
1.委托是一种类型(跟string,int,double...一样是.net的一种基本类型)
2.委托的定义必须与最终被调用的方法保持签名一致
比如:下面代码中的
delegate void D1(); 与 static void HelloWorld1(),我们抛开前面的类型关键字delegate与static,他们的签名都是void X()
void D2(string myName);与void HelloWorld2(string name); void HelloWorld3(string name);它们的签名格式都是 void X(string Y)
3.委托的好处之一在于可以保持签名格式不变的情况下,动态调用不同的处理逻辑(即不同的方法)
想想系统控件中的Button类,系统并不知道按钮按下去时到底会执行怎么样的逻辑(点击后的处理,每个项目可能都不一样,完全由需求决定),但是我们知道每个Button都有一个Click(object sender, EventArgs e)这样的东东,没错,就是委托(当然封装成了另一种衍生类型event),就是这种设计保证了统一的格式,不管你实际开发中想如何处理点击后的逻辑,只要按这个统一的签名来就行了
二 、匿名方法(.net2.0开始支持)
在“一、委托Delegate”的演示代码中,我们看到委托调用方法前,至少得先定义一个签名相同的方法,然后才能由委托调用(哪怕是只有一行代码的方法),可以直接加大括号,后面写方法代码就可以了,在.net3.0中连new delegate都不用写了,直接写()=>{},()是形参,{}是方法代码
三、Action
Action的本质就是委托,看它的定义:他就是一个没有返回值的委托
简单点讲,Action是参数从0到4,返回类型为void(即没有返回值)的委托
using System; namespace ActionStudy { class Program { static Action A1; static Action<string> A2; static void Main(string[] args) { A1 = new Action(HelloWorld1); A1(); A2 = new Action<string>(HelloWorld2); A2("Jimmy"); A2 = (string name) => { Console.WriteLine("你好,{0}!", name); }; A2("杨俊明"); A2 = delegate(string name) { Console.WriteLine("我就是委托,{0} 你说对吗?", name); }; A2("菩提树下的杨过"); Console.Read(); } static void HelloWorld1() { Console.WriteLine("Hello World!"); } static void HelloWorld2(string name) { Console.WriteLine("Hello,{0}!", name); } } }
四、Func
Func其实也是一个"托"儿,呵呵,不过这个委托是有返回值的。看下定义就知道了:
using System; namespace ActionStudy { class Program { static Func<string> F; static Func<DateTime, string> F2; static void Main(string[] args) { F = new Func<string>(HelloWorld1); Console.WriteLine(F()); F2 = new Func<DateTime, string>(HelloWorld2); Console.WriteLine(F2(DateTime.Now)); Console.Read(); } static string HelloWorld1() { return "Hello World!"; } static string HelloWorld2(DateTime time) { return string.Format("Hello World,the time is {0}.", time); } } }
五、匿名委托
ok,如果你没有晕的话,再来看一下匿名委托,其实这也是一种偷懒的小伎俩而已
看代码说话:
//F = new Func<string>(HelloWorld1);
其实也可以简写成这样:
F = HelloWorld1;
//F2 = new Func<DateTime, string>(HelloWorld2);
其实也可以简写成这样
F2 = HelloWorld2;
方法直接赋值给委托,这二个类型不同吧???
没错,你会发现编译一样能通过,系统在编译时在背后自动帮我们加上了类似 “= new Func<...>”的东东,所以我们能偷懒一下下,这个就是匿名委托。
如果你细心的话,会发现我们在定义Button的Click处理事件时,通常是这样的:
this.button1.Click += new EventHandler(button1_Click);
但有时候我们也可以写成这样:
this.button1.Click += button1_Click;
这其实就是匿名委托的应用.