3

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

MvcApplication app = this.HttpContext.ApplicationInstance as MvcApplication;

this.HttpContext.ApplicationInstance只包含超类,而不是Global.asax 中声明的派生类。因此,您在那里声明的任何实例属性都为空;

有没有解决的办法?不应该有办法访问派生的应用程序类吗?

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

还是做静态助手,没有缺点?

4

3 回答 3

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不为空。

于 2013-08-29T06:24:26.340 回答
1

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

我也有这个问题。

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

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

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

于 2013-09-09T04:26:20.750 回答
0

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

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

我认为您不知道 HttpApplication 类已被重用,并且我怀疑您的某些处理程序正在清理属性。

于 2013-08-29T08:41:30.540 回答