如何在请求上下文中访问MvcApplication类的实例属性?

时间:2013-08-29 06:21:00

标签: asp.net-mvc

在控制器内部操作中,您可以:

MvcApplication app = this.HttpContext.ApplicationInstance as MvcApplication;

但是this.HttpContext.ApplicationInstance只保存在Global.asax中声明的超类而不是派生类。因此,您在此处声明的任何实例属性都为null;

有解决方法吗?是否应该有办法访问派生的应用类?

我希望将(我的帮助程序类)的实例存储为应用程序实例中的实例属性,而不是将它们作为静态类。

或者做静态助手,没有缺点?

3 个答案:

答案 0 :(得分:4)

有一种解决方法,你已经写过了:

MvcApplication app = this.HttpContext.ApplicationInstance as MvcApplication;

如果您不喜欢,请尝试将MvcApplication课程更改为:

public class MvcApplication : HttpApplication
{
    public static MvcApplication Instance
    {
        get
        {
            // Current could be null, depending on the caller
            return HttpContext.Current != null
                ? HttpContext.Current.ApplicationInstance
                : null;
        }
    }
}

然后,您可以MvcApplication.Instance访问您的应用程序。请注意Instance不为空。

答案 1 :(得分:1)

迟到的答案(但对于需要帮助的人)。

我也有这个问题。

我认为您可以使用Application [“myKey”]数组来设置一些值。当然它们不是实例属性,但您可以设置依赖注入容器(例如Unity,在其代码示例中推荐此选项),然后使用Application [“myKey”]从控制器访问它。

来自http://msdn.microsoft.com/en-us/library/ms178473%28VS.80%29.aspx

  

您应该在应用程序启动期间仅设置静态数据。不要设置   任何实例数据,因为它只能用于第一个   创建的HttpApplication类的实例。

答案 2 :(得分:0)

使用单个静态类没有任何害处,因为您的代码也可以移植到非Web项目中。

理想情况下,您可以创建MyApp类并包装所有特定于应用程序的全局数据和其他实用程序方法,而不是静态属性。您可以在HttpContext.Current.Application中创建静态实例属性并存储MyApp实例,该实例可在每个请求中全局访问。

我认为你不知道HttpApplication类被重用了,我怀疑你的某个处理程序正在清理属性。