我之KT库之—–对象池。关于上下文(Context)/1(转MS)

打探还是认识KT:

 关于上下文
Susan Warren
Microsoft Corporation
2002年1月14日

http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html

编写 Web
应用程序时最好广大的题材之一,是要是被代码知道她的行上下文。让我们透过一个大概的例子(即个性化页面)来证实这个题材:
     请登录。

     欢迎 Susan!
虽然看起特别粗略,但就算是立即等同微截 Web
UI,仍然需要或多或少段信息,而且每次要该页时这些信息都见面发生变化。我们需要懂得以下内容:

 

  1. 用户登录了啊?
  2. 用户之显示名是啊?

每当品种中安使KT?

复常见的题材是,每次要该页时,唯一的上下文是呀?以及如何编写代码以便能够设想到者音?
实在,由于 HTTP 的不论状态特性,Web
应用程序可能要跟许多不一的上下文片段。当用户与 Web
应用程序交互时,浏览器将同一多元独立的 HTTP 请求发送到 Web 服务器。应用程序自身要用这些请求组织成令用户感到高兴的体验;同时,知道要的上下文也死首要。
ASP
引入了几乎单里头对象,如 RequestApplication,以便帮助跟踪 HTTP
请求的上下文。ASP.NET
完成下同样步骤,并拿这些目标以及任何几独和上下缓有关的目标捆绑在一道,形成一个多便利之里边对象
Context
Context 是 System.Web.HttpContext(英文)类型的对象。它看做
ASP.net
Page
类的性能公开。也可经过用户控件和业务对象(下文中详尽介绍)获得该对象。以下是
HttpContext 形成的目标的局部列表:

KT是一个仓库,所以用KT的dll文件引用到您的品种及即可使KT里之函数功能。

目标说明

 

Application

本节将介绍大家认识KT库里之对象池和怎么用其。KT里的对象池对象都存放于“KT.Core.ObjectPool“下,当您都于公的品种里引用了KT库后,则形容下以下代码就可使及KT里的有所目标池了。

价的要害字/值对聚集,可由应用程序的每个用户访问。Application 是
System.Web.HttpApplicationState 类型。

using KT.Core.ObjectPool;

ApplicationInstance

 

骨子里运作的应用程序,它公开一些请求处理事件。这些事件于
Global.asax、HttpHandler 或 HttpModule 中处理。

预先了解一下针对象池 

Cache

本着象池,顾名思义就用来存储对象的池塘(汗-_-!!),在它的生命周期内保障着她其中的富有目标,确保以跟一个生命周期内对象池里之数的唯一性。当对象池被销毁时,它其中的装有目标啊用随之销毁。

ASP.NET Cache 对象,它提供对缓存的编程访问。Rob Howard 的 ASP.NET Caching
专栏(英文)对缓存作了详细介绍。

 

Error

她的接口定义:

拍卖页时遇到的率先只谬误(如果生)。有关详细信息,请参考 Rob 撰写之
Exception to the Rule, Part
1(英文)。

/// <summary>
/// 对象池接口
/// </summary>
public interface IObjectPool : IDisposable
{
    /// <summary>
    /// 添加对象,如果已存在key,则更新旧值
    /// </summary>
    /// <param name="key">键值</param>
    /// <param name="value"></param>
    void Add(object key, object value);

    /// <summary>
    /// 判断是否存在某个对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    bool Contains(object key);

    /// <summary>
    /// 移除某个对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    bool Remove(object key);

    /// <summary>
    /// 返回某个对象,如果不存在则返回null
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    object Get(object key);

    /// <summary>
    /// 返回对象池中已存储的对象数量
    /// </summary>
    int Count { get; }

    /// <summary>
    /// 清空对象池
    /// </summary>
    void Clear();
}

Items

 

重大字/值对聚集,可以就此来以与拍卖同请求的享有组件之间传递信息。Items
System.Collections.IDictionary 类型。

眼下在KT里实现了这个接口的共有两独目标,如下:

Request

图片 1

关于 HTTP 请求的信,包括浏览器信息、Cookies
以及在窗体或询问字符串中传送的值。Request 是 System.Web.HttpRequest
类型。

 

Response

里DictionaryObjectPool是使Hashtable实现的对象池,用于为任何对象池提供基础服务。ObjectPoolBase则是一个抽象类,是另对象池的基类。

用以创造 HTTP 响应的安装与情节。Response 是 System.Web.HttpResponse
类型。

 

Server

本着象池的类型

服务器是一个实用程序类,带有一些行之有效的帮助器方法,包括
Server.Execute()Server.MapPath()
Server.HtmlEncode()。Server 是 System.Web.HttpServerUtility
类型的靶子。

冲生命周期的异,可分为差品种的对象池,KT目前共有以下几栽:

Session

 

价值的严重性字/值对聚集,可由应用程序的么用户访问。Session 是
System.Web.HttpSessionState 类型。

A、WebApplicationObjectPool: 基于ASP.NET 应用程序的对象池

Trace

    
对于和一个ASP.NET应用程序(同一个Web站点程序)来说,对象池里的数码都是集体的,使用示例:

ASP.NET 的 Trace 对象,提供针对性跟踪功能的访问。有关详细信息,请参考
Rob 撰写的篇章 Tracing(英文)。

WebApplicationObjectPool.Instance.Add("数据", "数据值");
var value1 = WebApplicationObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebApplicationObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

User

 

目前用户(如果已经过身份验证)的安及下文。Context.User.Identity
是用户之名目。User 是 System.Security.Principle.IPrincipal
类型的靶子。

留神:如果用在ASP.NET应用程序结束时自动回收数据,请于Global.asax里之Application_End事件里丰富回收代码,如下示例:

设你是如出一辙各类 ASP
开发人员,那么对上面讲述的片目标应无见面觉得陌生。虽然来一些更上一层楼,但大约而言,它们于
ASP.NET 中的用意及当 ASP 中凡是一心等同的。

protected void Application_End(object sender, EventArgs e)
{
    WebApplicationObjectPool.Instance.Dispose();
}

Context 基础知识

Context 中的有目标也曾经升格也 Page
中之顶级对象。例如,Page.Context.ResponsePage.Response
指的凡同一个目标,因此,以下代码是等价格的:

 

[Visual Basic® Web 窗体]

   Response.Write ("您好")   Context.Response.Write ("你好")

B、WebSessionObjectPool : 基于ASP.NET Session会话期的靶子池

[C# Web 窗体]

   Response.Write ("您好");   Context.Response.Write ("你好");

还得自事情对象下 Context 对象。HttpContext.Current
是静态属性,可以非常有利地回来时恳请的上下文。这当各种艺术被还老生因此,下面就列举一个自业务类的复苏存着觅项目的大概示例:

     对于跟一个Session会话来说,对象池里的数量都是公共的,使用示例:

[Visual Basic]

      ' 获取请求上下文      Dim _context As HttpContext = HttpContext.Current   ' 获取缓存中的数据集   Dim _data As DataSet = _context.Cache("MyDataSet")
WebSessionObjectPool.Instance.Add("数据", "数据值");
var value1 = WebSessionObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebSessionObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

[C#]

      // 获取请求上下文      HttpContext _context = HttpContext.Current;   // 获取缓存中的数据集   DataSet _data = _context.Cache("MyDataSet");

顾:如果急需在Session失效时自动回收数据,请以Global.asax里的Session_End事件里丰富回收代码,如下示例:

操作中之 Context

Context 对象也有广的
ASP.NET“如何…?”问题提供了答案。也许,说明这个宝贵对象的价的最好措施,就是于操作中将其显得出。下面是有的本身所理解之尽高明的
Context 技巧。

protected void Session_End(object sender, EventArgs e)
{
    WebSessionObjectPool.Instance.Dispose();
}

本人哪从自己之事体类似吃生成 ASP.NET 跟踪语句?

回答:很简单!使用 HttpContext.Current 获取 Context
对象,然后调用 Context.Trace.Write()

 

[Visual Basic]

Imports SystemImports System.WebNamespace Context   ' 演示从业务类中生成一个 ASP.NET    ' 跟踪语句。   Public Class TraceEmit            Public Sub SomeMethod()                  ' 获取请求上下文         Dim _context As HttpContext = HttpContext.Current                  ' 使用上下文编写跟踪语句         _context.Trace.Write("在 TraceEmit.SomeMethod 中")      End Sub   End ClassEnd Namespace   

 

[C#]

using System;using System.Web;namespace Context{   // 演示从业务类中生成一个 ASP.NET    // 跟踪语句。   public class TraceEmit   {        public void SomeMethod() {                    // 获取请求上下文            HttpContext _context = HttpContext.Current;            // 使用上下文编写跟踪语句            _context.Trace.Write("在 TraceEmit.SomeMethod 中");        }    }}

C、WebRequestObjectPool : 基于ASP.NET Request请求上下文的目标池

怎么样才能够由事情类似中访问会话状态值?

回答:很简单!使用 HttpContext.Current 获取 Context
对象,然后访问 Context.Session

     对于与一个Http Web
Request会话来说,对象池里的数据都是共用的,使用示例:

[Visual Basic]

Imports SystemImports System.WebNamespace Context   ' 演示从业务类中访问 ASP.NET 内部   ' 会话。   Public Class UseSession         Public Sub SomeMethod()                  ' 获取请求上下文         Dim _context As HttpContext = HttpContext.Current                  ' 访问内部会话         Dim _value As Object = _context.Session("TheValue")      End Sub   End ClassEnd Namespace
WebRequestObjectPool.Instance.Add("数据", "数据值");
var value1 = WebRequestObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebRequestObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

[C#]

using System;using System.Web;namespace Context{   // 演示从业务类中访问 ASP.NET 内部    // 会话   public class UseSession   {        public void SomeMethod() {                    // 获取请求上下文            HttpContext _context = HttpContext.Current;            // 访问内部会话            object _value = _context.Session["TheValue"];        }    }}

注意:如果急需在Http
Request完成时自动回收数据,请以web.config里登记WebRequestObjectPoolModule,如下示例:

怎么才会当应用程序的诸页中上加专业页眉和页脚?

回答:拍卖应用程序的 BeginRequestEndRequest 事件,并使用
Context.Response.Write 生成页眉和页脚的 HTML。
从技术上讲,可以当 HttpModule 中要么经采取 Global.asax 处理
BeginRequest 这样的应用程序。HttpModules
的编比较艰难,而且正使本例所示,简单应用程序使用的效益通常不下它。因此,我们下应用程序范围之
Global.asax 文件。
和 ASP 页一样,一些原本的 ASP.NET 上下文已升任也 HttpApplication
类的性质,其中的切近表示 Global.asax 继承类。我们无待采取
HttpContext.Current 获取对 Context 对象的援;它于 Global.asax.
中都可用。
本例中,我用 <html> 和 <body>
标记和同修水平线放入页眉部分,而以另一样条水平线和相应的终结标记放入页脚部分。页脚还蕴含版权消息。运行结果应设下图所示:
图片 2
祈求 1:浏览器中见的规范页眉和页脚示例
立即是一个简单的以身作则,但您得好爱地拿其扩展,使该蕴藉标准的页眉与导航,或者仅输出相应的
<!– #include —>
语词。请小心,如果想页眉或页脚包含交互内容,应考虑采用 ASP.NET
用户控件。

        <httpModules>
            <add name="WebRequestObjectPoolModule" type="KT.Core.ObjectPool.WebRequestObjectPoolModule" />
        </httpModules>

[SomePage.aspx 源代码 – 内容示例]

<FONT face="Arial" color="#cc66cc" size="5">常规页面内容</FONT>

 

[Visual Basic Global.asax]

<%@ Application Language="VB" %><script runat="server">      Sub Application_BeginRequest(sender As Object, e As EventArgs)         ' 生成页眉         Context.Response.Write("<html>" + ControlChars.Lf + _"<body bgcolor=#efefef>" + ControlChars.Lf + "<hr>" + _ ControlChars.Lf)      End Sub                   Sub Application_EndRequest(sender As Object, e As EventArgs)         ' 生成页脚         Context.Response.Write("<hr>" + ControlChars.Lf + _      "2002 Microsoft Corporation 版权所有" + _      ControlChars.Lf + "</body>" + ControlChars.Lf + "</html>")      End Sub </script>

 

[C# Global.asax]

<%@ Application Language="C#" %><script runat="server">        void Application_BeginRequest(Object sender, EventArgs e) {            // 生成页眉            Context.Response.Write("<html>\n<body bgcolor=#efefef>\n<hr>\n");        }        void Application_EndRequest(Object sender, EventArgs e) {            // 生成页脚            Context.Response.Write("<hr>\2002 Microsoft Corporation 版权所有\n");            Context.Response.Write("</body>\n</html>");        }</script>

D、ThreadCallObjectPool :
基于线程调用的对象池。此对象池可以在ASP.NET和Application环境下采取。

怎么样以用户通过身份验证后显示欢迎信息?

回答:测试 User
上下文对象为查看用户是否由此身份验证。如果是,还要从 User
对象获得用户称。当然,这是本文开头的以身作则。

    对于跟一个线程来说,对象池里的数量是公的。使用示例:

public class Program
{
    static void Main(string[] args)
    {
        for (var i = 0; i < 100; i++)
        {
            Thread th = new Thread(()=>{
                var name = ThreadCallObjectPool.Instance.GetOrAdd<string>("K", ()=>Thread.CurrentThread.Name);
                Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, name);
                Thread.Sleep(10);
                Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, ThreadCallObjectPool.Instance.Get("K"));
            });
            th.Name = i.ToString();
            th.Start();
        }
        Console.Read();
    }
}

 

动对象池上下文

KT里供一个时上下文的靶子池调用“ObjectPoolContext”,此目标见面自行根据你所处的上下文环境,调用对应之靶子池实例。比如您眼前的先后是运行于ASP.NET
Web环境下,则会调用WebRequestObjectPool而若是在Application环境下则会调用ThreadCallObjectPool对象池,如下示例代码:

/// <summary>
/// 商家模块
/// </summary>
public IMerchantsModule MerchantsModule
{
    get
    {
        return ObjectPoolContext.Current.GetOrAdd<IMerchantsModule>(
            typeof(MerchantsModule), () =>
            {
                return new MerchantsModule(this.DbHelper);
            });
    }
}
以上代码,不管是在ASP.NET环境还是在Application环境都可以正常运行。

相关文章