在控制器内部操作中,您可以:
MvcApplication app = this.HttpContext.ApplicationInstance as MvcApplication;
但是this.HttpContext.ApplicationInstance
只保存在Global.asax中声明的超类而不是派生类。因此,您在此处声明的任何实例属性都为null;
有解决方法吗?是否应该有办法访问派生的应用类?
我希望将(我的帮助程序类)的实例存储为应用程序实例中的实例属性,而不是将它们作为静态类。
或者做静态助手,没有缺点?
答案 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类被重用了,我怀疑你的某个处理程序正在清理属性。