为什么我的HttpApplication实例变量为null?

sco*_*ttm 3 c# httpcontext asp.net-mvc-3

我有一个MVC3应用程序,我已经添加了几个简单的缓存变量作为属性.我添加了我的数据,Application_Start然后在控制器中尝试将其转换HttpContext.ApplicationInstance回我的类型以访问它.但是,该属性始终为null.这是一个例子:

编辑工作实例

public interface IMyMvcApp
{
    Hashtable Cache {get;set;}
}


public class MvcApplication: HttpApplication, IMyMvcApp
{

    public Hashtable Cache 
    {
        get { return Context.Cache["MyStuff"] as Hashtable; }
        set { Context.Cache["MyStuff"] = value}
    }

    public void Application_Start()
    {
        Cache = new Hashtable();
        Cache.Add("key", new object());
    }
}

public class AController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        var myApp = context.HttpContext.ApplicationInstance as IMyMvcApp;

        Assert.IsNotNull(myApp.Cache);
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

框架创建了多个应用程序实例.要验证这一点,请添加一个空构造函数并在其中添加断点.您将看到此构造函数将被多次命中,而Application_Start只会被命中一次.

因此,不应重新发明轮子,而应使用已构建到框架中的Cache对象:

protected void Application_Start()
{
    ...
    Context.Cache["key"] = new object();
}
Run Code Online (Sandbox Code Playgroud)

然后:

protected override void OnActionExecuting(ActionExecutingContext context)
{
    var value = context.HttpContext.Cache["key"];
}
Run Code Online (Sandbox Code Playgroud)