ASP。NET的设计思想

自从有了html与http,就有了浏览器与Web服务器,并有了Web应用,最初的交互模式是这样的:

      该模式很好地运行了很多年。然而,随着计算机应用的发展,人们越来越不满足于只有静态内容的页面,而由某种机制动态产生html等代码的需求越来越迫切,于是,很多技术就应运而生,Asp.net就是这样一种技术。从本质上讲,Asp.net就是一种服务器端动态产生html、css、javascript等浏览器认识的代码的技术。Asp.net的交互模式如下:

 

      由该图可知,Asp.net必须解决两大问题,一是如何与Web服务器(一般就是指IIS)进行交互,二是如何根据不同请求产生不同的html等代码。

 

      第一个问题,根据IIS版本(5.*,6.0,7.0)的不同,Asp.net具有不同的进程模式与不同的交互模式,该问题不是本篇要讲述的。一般来说,大家不必关心该问题,而且要了解该问题,又必须清楚IIS各个版本的模型,而各个版本又各有各的不同,因此,我基本不准备讲述这个问题,大家有兴趣的话,可以自行搜索相关资料。

      我们来讨论第二个问题,这里首先要说明的是,因为IIS7.0进程模式的变化比较大,我也没去了解IIS7.0的模型,因此,以下讲述及以后讲述将只针对IIS5.*与IIS6.0。我们有理由认为,针对IIS5.*与IIS6.0的讲述一般同样适用于IIS7.0。

      先且按下该问题不表,我们来看一段请求玉帝把大象放到冰箱里的代码(为什么不是上帝?因为我中华不归上帝管),请大家先跟着我的思路来,别急,别急。

ContractedBlock.gifExpandedBlockStart.gifCode1
using System;

namespace ConsoleApplication3
ExpandedBlockStart.gifContractedBlock.gif
{
    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= new Emperor();
            
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Console.WriteLine(
"首先给玉帝准备好大象和冰箱。");

                Console.WriteLine(
"输入大象的名字:");
                
string elephantName = Console.ReadLine();
                Console.WriteLine(
"输入大象的体重:");
                
int elephantWeight = int.Parse(Console.ReadLine());
                Console.WriteLine(
"输入冰箱的名字:");
                
string refrigeratorName = Console.ReadLine();

                Elephant elephant 
= new Elephant()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Name 
= elephantName,
                    Weight 
= elephantWeight
                }
;
                Refrigerator refrigerator 
= new Refrigerator()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Name 
= refrigeratorName
                }
;

                Context context 
= new Context()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Elephant 
= elephant,
                    Refrigerator 
= refrigerator
                }
;

                emperor.ProcessRequest(context);

                Console.WriteLine(
"是否要玉帝继续把大象关进冰箱里?");
                
string answer = Console.ReadLine();
                
if (answer == "n")
                    
break;
            }

        }

    }


    
class Emperor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public void ProcessRequest(Context context)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Elephant elephant 
= context.Elephant;
            Refrigerator refrigerator 
= context.Refrigerator;

            
//第一步,打开冰箱门
            refrigerator.IsOpen = true;
            Console.WriteLine(
string.Format("玉帝打开了 {0} 的冰箱门。", refrigerator.Name));

            
//第二步,把大象放进去
            refrigerator.Content = elephant;
            Console.WriteLine(
string.Format("玉帝把大象 {0} 放到冰箱 {1} 里了。", elephant.Name, refrigerator.Name));

            
//第三步,关上冰箱门
            refrigerator.IsOpen = false;
            Console.WriteLine(
string.Format("玉帝关上了 {0} 的冰箱门。", refrigerator.Name));
        }

    }


    
class Elephant
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public string Name getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public int Weightgetset; }
    }


    
class Refrigerator
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public string Name getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public bool IsOpen getset; }

        
private object m_Content;
        
public object Content
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return this.m_Content; }
            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (!this.IsOpen)
                    
throw new InvalidOperationException("冰箱门未打开,无法放进东西。");
                
if (this.m_Content != null)
                    
throw new InvalidOperationException("冰箱内有东西,无法放进新的东西。");

                
this.m_Content = value;
            }

        }

    }


    
class Context
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Elephant Elephant getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Refrigerator Refrigerator getset; }
    }

}

 

      请大家先认真读懂该代码,该代码不会有问题吧,如果有问题,那么还请你一定先读懂该代码再往下看。

      后来,玉帝累了,他想啊,我堂堂玉帝,居然亲自干这种没含量的活,但是顾客是玉帝的玉帝,又不能不干。于是,玉帝找了两个手下(把门大神、神象星宿)来帮他干活。

ContractedBlock.gifExpandedBlockStart.gifCode2
using System;
using System.Collections.Generic;

namespace ConsoleApplication3
ExpandedBlockStart.gifContractedBlock.gif
{
    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= new Emperor();
            emperor.Init();

            
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Console.WriteLine(
"首先给玉帝准备好大象和冰箱。");

                Console.WriteLine(
"输入大象的名字:");
                
string elephantName = Console.ReadLine();
                Console.WriteLine(
"输入大象的体重:");
                
int elephantWeight = int.Parse(Console.ReadLine());
                Console.WriteLine(
"输入冰箱的名字:");
                
string refrigeratorName = Console.ReadLine();

                Elephant elephant 
= new Elephant()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Name 
= elephantName,
                    Weight 
= elephantWeight
                }
;
                Refrigerator refrigerator 
= new Refrigerator()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Name 
= refrigeratorName
                }
;

                Context context 
= new Context()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Elephant 
= elephant,
                    Refrigerator 
= refrigerator
                }
;

                emperor.ProcessRequest(context);

                Console.WriteLine(
"是否要玉帝继续把大象关进冰箱里?");
                
string answer = Console.ReadLine();
                
if (answer == "n")
                    
break;
            }

        }

    }


    
class Emperor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
private IList<IEmperorModule> m_Modules;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Context Context getset; }

        
public void Init()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            m_Modules 
= new List<IEmperorModule>();
            m_Modules.Add(
new OpenCloseRefrigeratorDoorModule());
            m_Modules.Add(
new PutElephantToRefrigeratorModule());

            
foreach (IEmperorModule module in this.m_Modules)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                module.Init(
this);
            }

        }


        
public void ProcessRequest(Context context)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
this.Context = context;

            
this.OnOpenRefrigeratorDoor();
            
this.OnPutElephantToRefrigerator();
            
this.OnCloseRefrigeratorDoor();
        }


        
public event EventHandler OpenRefrigeratorDoor;
        
public event EventHandler PutElephantToRefrigerator;
        
public event EventHandler CloseRefrigeratorDoor;

        
protected virtual void OnOpenRefrigeratorDoor()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            EventHandler handler 
= this.OpenRefrigeratorDoor;
            
if (handler != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                handler(
this, EventArgs.Empty);
            }

        }


        
protected virtual void OnPutElephantToRefrigerator()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            EventHandler handler 
= this.PutElephantToRefrigerator;
            
if (handler != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                handler(
this, EventArgs.Empty);
            }

        }


        
protected virtual void OnCloseRefrigeratorDoor()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            EventHandler handler 
= this.CloseRefrigeratorDoor;
            
if (handler != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                handler(
this, EventArgs.Empty);
            }

        }

    }


    
class Elephant
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public string Name getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public int Weightgetset; }
    }


    
class Refrigerator
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public string Name getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public bool IsOpen getset; }

        
private object m_Content;
        
public object Content
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return this.m_Content; }
            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (!this.IsOpen)
                    
throw new InvalidOperationException("冰箱门未打开,无法放进东西。");
                
if (this.m_Content != null)
                    
throw new InvalidOperationException("冰箱内有东西,无法放进新的东西。");

                
this.m_Content = value;
            }

        }

    }


    
class Context
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Elephant Elephant getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Refrigerator Refrigerator getset; }
    }


    
interface IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
void Init(Emperor emperor);
    }


    
class OpenCloseRefrigeratorDoorModule : IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IEmperorModule 成员#region IEmperorModule 成员
        
public void Init(Emperor emperor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            emperor.OpenRefrigeratorDoor 
+= new EventHandler(this.OpenDoor);
            emperor.CloseRefrigeratorDoor 
+= new EventHandler(this.CloseDoor);
        }

        
#endregion


        
private void OpenDoor(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;
            refrigerator.IsOpen 
= true;
            Console.WriteLine(
string.Format("玉帝的把门大神打开了 {0} 的冰箱门。", refrigerator.Name));
        }


        
private void CloseDoor(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;
            refrigerator.IsOpen 
= false;
            Console.WriteLine(
string.Format("玉帝的把门大神关上了 {0} 的冰箱门。", refrigerator.Name));
        }

    }


    
class PutElephantToRefrigeratorModule : IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IEmperorModule 成员#region IEmperorModule 成员
        
public void Init(Emperor emperor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            emperor.PutElephantToRefrigerator 
+= new EventHandler(this.PutElephantToRefrigerator);
        }

        
#endregion


        
private void PutElephantToRefrigerator(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Elephant elephant 
= emperor.Context.Elephant;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;
            refrigerator.Content 
= elephant;
            Console.WriteLine(
string.Format("玉帝的神象星宿把大象 {0} 放到冰箱 {1} 里了。", elephant.Name, refrigerator.Name));
        }

    }

}

 

      观测该代码有哪些变化?玉帝增加了一个Init方法,该方法召集了那些干活的手下,并交待手下你们要干的事情(初始化)。所有手下都继承自IEmperorModule接口,该接口有一个Init方法,以初始化该手下能干的活。玉帝的ProcessRequest方法不再亲自干活了,而仅仅是在那边喊,该开门了,该把大象放进去了,该关门了。

      (来点题外话,上面代码应用了模板方法模式,或者说是模板方法的变种。什么,不是,没有抽象类,没有抽象方法,没有子类?请问,模板方法一定要有抽象类吗?一定要有抽象方法吗?一定要有子类吗?我想,模板方法的精髓,在于它规定了特定的步骤算法,而这些步骤在必要的时候可以委托给其它方法实现。在传统的模板方法中,是委托给子类实现,而在我们拥有委托的情况下,难道我们不能委托给其它类实现吗?其实,我想,学习设计模式,不要拘泥于形式,而要掌握其精髓,并灵活运用。就Gof的23种设计模式来说,我觉得其精髓几乎全部可由一句话概括。)

      天有不测风云,人有旦夕祸福,某一天,这神象星宿病了,他赶不动超过1000斤的大象了,怎么办?玉帝于是又召集了超级神象星宿,可但凡有点能耐的都有点脾气,超级神象星宿表示,只有其它人赶不动的大象他才来赶。

ContractedBlock.gifExpandedBlockStart.gifCode3
using System;
using System.Collections.Generic;

namespace ConsoleApplication3
ExpandedBlockStart.gifContractedBlock.gif
{
    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= new Emperor();
            emperor.Init();

            
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Console.WriteLine(
"首先给玉帝准备好大象和冰箱。");

                Console.WriteLine(
"输入大象的名字:");
                
string elephantName = Console.ReadLine();
                Console.WriteLine(
"输入大象的体重:");
                
int elephantWeight = int.Parse(Console.ReadLine());
                Console.WriteLine(
"输入冰箱的名字:");
                
string refrigeratorName = Console.ReadLine();

                Elephant elephant 
= new Elephant()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Name 
= elephantName,
                    Weight 
= elephantWeight
                }
;
                Refrigerator refrigerator 
= new Refrigerator()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Name 
= refrigeratorName
                }
;

                Context context 
= new Context()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Elephant 
= elephant,
                    Refrigerator 
= refrigerator
                }
;

                emperor.ProcessRequest(context);

                Console.WriteLine(
"是否要玉帝继续把大象关进冰箱里?");
                
string answer = Console.ReadLine();
                
if (answer == "n")
                    
break;
            }

        }

    }


    
class Emperor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
private IList<IEmperorModule> m_Modules;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Context Context getset; }

        
public void Init()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            m_Modules 
= new List<IEmperorModule>();
            m_Modules.Add(
new OpenCloseRefrigeratorDoorModule());
            m_Modules.Add(
new PutElephantToRefrigeratorModule());
            m_Modules.Add(
new SuperPutElephantToRefrigeratorModule());

            
foreach (IEmperorModule module in this.m_Modules)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                module.Init(
this);
            }

        }


        
public void ProcessRequest(Context context)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
this.Context = context;

            
this.OnOpenRefrigeratorDoor();
            
this.OnPutElephantToRefrigerator();
            
this.OnCloseRefrigeratorDoor();
        }


        
public event EventHandler OpenRefrigeratorDoor;
        
public event EventHandler PutElephantToRefrigerator;
        
public event EventHandler CloseRefrigeratorDoor;

        
protected virtual void OnOpenRefrigeratorDoor()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            EventHandler handler 
= this.OpenRefrigeratorDoor;
            
if (handler != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                handler(
this, EventArgs.Empty);
            }

        }


        
protected virtual void OnPutElephantToRefrigerator()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            EventHandler handler 
= this.PutElephantToRefrigerator;
            
if (handler != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                handler(
this, EventArgs.Empty);
            }

        }


        
protected virtual void OnCloseRefrigeratorDoor()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            EventHandler handler 
= this.CloseRefrigeratorDoor;
            
if (handler != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                handler(
this, EventArgs.Empty);
            }

        }

    }


    
class Elephant
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public string Name getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public int Weightgetset; }
    }


    
class Refrigerator
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public string Name getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public bool IsOpen getset; }

        
private object m_Content;
        
public object Content
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return this.m_Content; }
            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (!this.IsOpen)
                    
throw new InvalidOperationException("冰箱门未打开,无法放进东西。");
                
if (this.m_Content != null)
                    
throw new InvalidOperationException("冰箱内有东西,无法放进新的东西。");

                
this.m_Content = value;
            }

        }

    }


    
class Context
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Elephant Elephant getset; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public Refrigerator Refrigerator getset; }

        
private IDictionary<stringobject> m_Items;
        
public IDictionary<stringobject> Items
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (this.m_Items == null)
                    
this.m_Items = new Dictionary<stringobject>();
                
return this.m_Items;
            }

        }

    }


    
interface IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
void Init(Emperor emperor);
    }


    
class OpenCloseRefrigeratorDoorModule : IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IEmperorModule 成员#region IEmperorModule 成员
        
public void Init(Emperor emperor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            emperor.OpenRefrigeratorDoor 
+= new EventHandler(this.OpenDoor);
            emperor.CloseRefrigeratorDoor 
+= new EventHandler(this.CloseDoor);
        }

        
#endregion


        
private void OpenDoor(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;
            refrigerator.IsOpen 
= true;
            Console.WriteLine(
string.Format("玉帝的把门大神打开了 {0} 的冰箱门。", refrigerator.Name));
        }


        
private void CloseDoor(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;
            refrigerator.IsOpen 
= false;
            Console.WriteLine(
string.Format("玉帝的把门大神关上了 {0} 的冰箱门。", refrigerator.Name));
        }

    }


    
class PutElephantToRefrigeratorModule : IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IEmperorModule 成员#region IEmperorModule 成员
        
public void Init(Emperor emperor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            emperor.PutElephantToRefrigerator 
+= new EventHandler(this.PutElephantToRefrigerator);
        }

        
#endregion


        
private void PutElephantToRefrigerator(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Elephant elephant 
= emperor.Context.Elephant;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;

            
if (elephant.Weight > 1000)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Console.WriteLine(
"这头大象实在太重了,我神象星宿挪不动阿。");
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                refrigerator.Content 
= elephant;
                emperor.Context.Items[
"HasPutElephant"= true;
                Console.WriteLine(
string.Format("玉帝的神象星宿把大象 {0} 放到冰箱 {1} 里了。", elephant.Name, refrigerator.Name));
            }

        }

    }


    
class SuperPutElephantToRefrigeratorModule : IEmperorModule
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IEmperorModule 成员#region IEmperorModule 成员
        
public void Init(Emperor emperor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            emperor.PutElephantToRefrigerator 
+= new EventHandler(this.PutElephantToRefrigerator);
        }

        
#endregion


        
private void PutElephantToRefrigerator(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Emperor emperor 
= (Emperor)sender;
            Elephant elephant 
= emperor.Context.Elephant;
            Refrigerator refrigerator 
= emperor.Context.Refrigerator;

            
object hasPutElephant;
            
if (emperor.Context.Items.TryGetValue("HasPutElephant"out hasPutElephant))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (hasPutElephant is bool && ((bool)hasPutElephant) == true)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Console.WriteLine(
"已经有人把大象放进冰箱了,我超级神象星宿就歇歇了。");
                    
return;
                }

            }


            refrigerator.Content 
= elephant;
            emperor.Context.Items[
"HasPutElephant"= true;
            Console.WriteLine(
string.Format("玉帝的超级神象星宿把大象 {0} 放到冰箱 {1} 里了。", elephant.Name, refrigerator.Name));
        }

    }

}

      仔细琢磨该代码,请问你发现了什么?如果你发现的是灵活的可扩展性和可配置性,以及各手下之间的交互,那么恭喜你,你悟性很高。如果你还发现了职责链模式,那么恭喜你,你悟性非常高。(该代码中两个神象星宿的交互完全可以通过在Context中增加一个bool值属性来实现,之所有这里用Items字典,是为了演示如果你不具有修改Context的源代码的时候,该如何处理。)

     好了,Asp.net的设计思想讲完了。什么,还没开始?你没发现我们的Program就是HttpRuntime、Emperor就是HttpApplication、Context就是HttpContext、IEmperorModule就是IHttpModule吗?什么,没发现?那么,让我们来看看Asp.net的源代码吧。(本想把整个方法的源代码都贴上来,但是显得过于冗长,因此删掉非关键代码,并以//……省略……代替。)

 

      如此,你明白了吗?

转载于:https://www.cnblogs.com/aaa6818162/archive/2009/10/30/1592886.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kali linux 渗透测试技术之搭建WordPress Turnkey Linux及检测WordPress 应用程序漏洞

From&#xff1a;https://bbs.ichunqiu.com/thread-15716-1-1.html 怎样用 WPScan&#xff0c;Nmap 和 Nikto 扫描和检查一个 WordPress 站点的安全性&#xff1a;https://www.cnblogs.com/chayidiansec/p/7989274.html 为了收集用于测试的应用程序&#xff0c; Turnkey Linux…

AI芯片格局分布

来源&#xff1a;中国科学院自动化研究所 作者&#xff1a; 吴军宁如果说2016年3月份AlphaGo与李世石的那场人机大战只在科技界和围棋界产生较大影响的话&#xff0c;那么2017年5月其与排名第一的世界围棋冠军柯洁的对战则将人工智能技术推向了公众视野。阿尔法狗&#xff08;…

科学互驳:大脑细胞活到老,长到老?

来源&#xff1a;中国生物技术网 作者&#xff1a;格格科学家发现&#xff0c;人脑中与学习、记忆和情感相关的区域在成年后依然会持续产生新的神经元。这与过去的理论恰恰相反&#xff0c;即青春期之后大脑停止产生新的神经元。这项发现有助于我们开发治疗神经系统疾病的新方…

AI综述专栏 | 朱松纯教授浅谈人工智能:现状、任务、构架与统一

作者&#xff1a;朱松纯来源&#xff1a;人工智能前沿讲习班导读本文作者&#xff1a;朱松纯&#xff0c;加州大学洛杉矶分校UCLA统计学和计算机科学教授&#xff0c;视觉、认知、学习与自主机器人中心主任。文章前四节浅显探讨什么是人工智能和当前所处的历史时期&#xff0c;…

联想linux笔记本评测,联想(lenovo)G460AL-ITH Linux笔记本电脑接口评测-ZOL中关村在线...

模具和外观的“革新”让我们见识到不一样的联想G460&#xff0c;而在整机的接口扩展能力方面依旧主打实用性。机身左侧从左至右依次是安全锁孔、散热孔、RJ-45以太网接口、VGA视频输出接口、USB2.0接口、e-SATA接口(兼容USB2.0)、Express Card卡槽和HDMI高清视频输出接口。与前…

联合国召开会议讨论“杀手机器人”问题

来源&#xff1a;中国科学报 作者&#xff1a;赵熙熙来自29个国家的57位科学家日前呼吁联合抵制一所韩国大学&#xff0c;因为设立在该校的一个新的中心旨在利用人工智能强化国家安全。人工智能科学家表示&#xff0c;该大学正在开发自主武器&#xff0c;又称“杀手机器人”&a…

【转】近期Coolite控件的技术点总结

1。Coolite下如何自定义控件样式表Code1<style type"text/css"> 2 .x-grid3-td-fullName .x-grid3-cell-inner {}{ 3 font-family:tahoma, verdana; 4 display:block; 5 font-weight:normal; 6 font-style…

Anaconda 完全入门指南

From&#xff1a;https://www.jianshu.com/p/eaee1fadc1e9 Anaconda官网&#xff1a;https://www.anaconda.com/ Anaconda 官网 文档&#xff1a;http://docs.anaconda.com/anaconda/user-guide Anaconda介绍、安装及使用教程&#xff1a;https://zhuanlan.zhihu.com/p/32925…

linux资源使用统计指南,指南:工作量分析文档

指南&#xff1a;工作量分析文档工作量分析文档工作量分析文档用于在不同的性能测试中确定要使用的变量并定义变量值&#xff0c;利用这些性能测试可以模拟主角特征、最终用户业务功能(用例)、负载和容量。主题软件质量要从不同的维度来进行评估&#xff0c;其中包括可靠性、功…

Python爬取大量数据时防止被封IP

From&#xff1a;http://blog.51cto.com/7200087/2070320 基于scrapy框架的爬虫代理IP设置&#xff1a;https://www.jianshu.com/p/074c36a7948c Scrapy: 针对特定响应状态码&#xff0c;使用代理重新请求&#xff1a;http://www.cnblogs.com/my8100/p/scrapy_middleware_aut…

最近发包给朋友,搞定软件小活儿、解决小功能模块的感受

有时候也想&#xff0c;所有的事情都靠自己解决&#xff0c;太辛苦了太累了&#xff0c;在不差钱的这个年代&#xff0c;有些能让别人做的事情&#xff0c;就让别人做吧&#xff0c;但是一直找不到合适的人&#xff0c;什么叫合适的人&#xff1f;我简单的说几下&#xff0c;不…

利用自定义web-font实现数据防采集

From&#xff1a;https://blog.csdn.net/fdipzone/article/details/68166388 完整源码&#xff1a;https://download.csdn.net/download/fdipzone/9798142 web-font介绍 web-font 是 CSS3 中的一种标记 font-face&#xff0c;在 font-face 声明里&#xff0c;你可以声明一种字…

数字证书~证书链

来源&#xff1a;客户端认证https服务端证书过程详解——证书链_huzhenv5的博客-CSDN博客_证书链认证过程 基本概念 证书 首先&#xff0c;我们看看在wikipedia上对证书的定义&#xff0c;In cryptography, a public key certificate (also known as a digital certificate o…

反反爬技术,破解猫眼网加密数字

From&#xff1a;https://blog.csdn.net/qq_31032181/article/details/79153578 From&#xff1a;http://www.freebuf.com/news/140965.html 利用自定义web-font实现数据防采集&#xff1a;http://blog.csdn.net/fdipzone/article/details/68166388 利用前端字体文件(.ttf)混…

数字签名,数字证书,证书链原理

来源&#xff1a;数字签名&#xff0c;数字证书&#xff0c;证书链原理&#xff08;图文详解&#xff09;_Ruby丶彬的博客-CSDN博客_证书链验证原理 数字签名&#xff0c;数字证书&#xff0c;加密简述 数字签名&#xff1a;谈及数字签名&#xff0c;就如小时候老师叫把卷子或…

猫眼 — 破解数字反爬获取实时票房

From&#xff1a;https://zhuanlan.zhihu.com/p/33112359 js分析 猫_眼_电_影 字体文件 font-face&#xff1a;https://www.cnblogs.com/my8100/p/js_maoyandianying.html 解析某电影和某招聘网站的web-font自定义字体&#xff1a;https://www.jianshu.com/p/5400bbc8b634 Fo…

Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」

原文来源&#xff1a;arXiv 作者&#xff1a;Alex Lamb、Jonathan Binas、Anirudh Goyal、Dmitriy Serdyuk、Sandeep Subramanian、Ioannis Mitliagkas、Yoshua Bengio「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA导语&#xff1a;深度神经网络在各种各样的重要任…

PDF签名系列(1):PDF签名机制的漏洞分析

来源&#xff1a;PDF签名系列(1):PDF签名机制的漏洞分析 - 知乎 研究PDF文件的签名机制有一段时间了&#xff0c;刚开始学习的时候就看到有提到说&#xff0c;被签名的PDF内容的Range gap&#xff0c;会成为这个机制的漏洞&#xff0c;但是一直不能完全参透。直到昨天看到一篇…

linux date命令显示毫秒,解决MacOS系统中date命令没有毫秒和sha512sum、sha256sum、md5sum等命令的问题...

安装brew/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"使用brew安装coreutilsbrew install coreutils设置系统新的命令软连接sudo ln -sv /usr/local/bin/gsha256sum /usr/local/bin/sha256sumsudo ln -sv /…

PDF签名系列(2):PDF的签名值到底存在哪里?

来源&#xff1a;PDF签名系列(2):PDF的签名值到底存在哪里? - 知乎 研究过PDF签名的同学应该见过下面这张图, 来自ADOBE的文档Acrobat_DigitalSignatures_in_PDF.pdf PDF被签名的内容是整个文档除去signature dictionary里/Contents下面的内容. 签过名的哈希值再连同其他一些…