为了在程序启动时执行代码,我们需要创建一个名为Global.asax的文件。该文件包含了application、session和request级事件的事件处理器。在该文件里我们将添加在程序启动时要执行的代码。
要在网站根目录里添加Global.asax文件,在Visual Studio解决资源管理器里,右击网站项目,选Add New Item,从Add New Item对话框里选择Global应用程序项目类型,然后点Add按钮。
注意:如果你的根目录里已经存在Global.asax文件,Global应用程序项目类型就不会出现在Add New Item对话框里。
图3:在根目录添加Global.asax文件。
默认的Global.asax文件里包括了5个方法,每个方法都有一个服务器端(server-side)<script>标记:
Application_Start –当程序启动时执行
Application_End – 当程序完结时执行
Application_Error – 每当程序发生未经处理(unhandled)的异常时发生。
Session_Start – 当创建一个session时执行
Session_End – 当session完结时或被移除时发生
Application_Start事件处理器在程序的生命周期(life cycle)里只发生一次。程序起始于一个ASP.NET资源(resource)首次被请求,持续运行直到程序重新启动为止。关于程序生命周期的更多细节请参阅文章《ASP.NET Application Life Cycle Overview》
本文,我们只需要为Application_Start方法添加代码,放心大胆的将其它方法删除。在Application_Start里,仅仅调用StaticCacheclass类的LoadStaticCache()方法。这将装载并缓存supplier信息:
<%@ Application Language="C#" %> <script runat="server"> void Application_Start(object sender, EventArgs e) { StaticCache.LoadStaticCache(); } </script>
要做的就是这些!在程序开始时,LoadStaticCache()方法会从BLL获取supplier信息,再存储进一个static member变量(或是你在StaticCache class类里面用的其它一些cache store)。为验证起见,在Application_Start 方法里设置断点(breakpoint)并执行程序。另外,在并发请求(Subsequent requests)时,不会执行Application_Start方法。
图4:用Breakpoint来验证Application_Start事件处理器的执行
注意:如果你在首次调试时没有遇到Application_Start breakpoint,那是因为你的程序已经启动了。可以修改Global.asax 或 Web.config文件来强迫程序重新启动。你仅仅在这些文件的末尾添加(或删除)一个空白行来快速的重启程序。
第五步:展示缓存数据
现在,StaticCache class类在程序启动时将supplier相关的数据进行了缓存。要在表现层使用这些数据,我们可以在ASP.NET页面的后台代码通过ObjectDataSource控件或编程调用StaticCache class类的GetSuppliers()方法。让我们看看如何使用ObjectDataSource 和 GridView控件来展示缓存的supplier信息。
首先,打开文件夹里的AtApplicationStartup.aspx页面,在“设计”模式里从工具箱里拖一个GridView控件到页面,设置其ID为Suppliers。然后,从其智能标签里选择创建一个新的ObjectDataSource,名为SuppliersCachedDataSource,设置它使用StaticCache class类的GetSuppliers()方法。
图5:设置ObjectDataSource控件使用StaticCache Class类
图6:使用GetSuppliers()方法来获取缓存的Supplier数据
完成设置后,Visual Studio会自动的为SuppliersDataTable里的每一个列添加一个BoundFields。因此,你的GridView 和 ObjectDataSource控件的声明标记看起来应该像下面这样:
<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="SupplierID" DataSourceID="SuppliersCachedDataSource" EnableViewState="False"> <Columns> <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" InsertVisible="False" ReadOnly="True" SortExpression="SupplierID" /> <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" SortExpression="CompanyName" /> <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" /> <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" /> <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" /> <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" /> </Columns> </asp:GridView> <asp:ObjectDataSource runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetSuppliers" TypeName="StaticCache" />