asp.net MVC是否有应用程序variables?
我正忙于将Web应用程序转换为MVC,并将一些信息保存到跨多个租户/帐户使用的应用程序variables,以使事情变得更有效率。
我意识到MVC的重点是尽可能保持无状态,Sesion State在MVC中存在和存在显然是有意义的,但是我们不想仅仅将Application转换为Sessionvariables,因为我们宁愿有一些更全局和更安全的东西。 MVC应用程序是否具有应用程序variables? 我看过一些使用caching的例子吗? 这是现在的标准,这与应用程序/会话状态相比有多强大/安全?
是的,您可以从.NET MVC访问应用程序variables。 就是这样:
System.Web.HttpContext.Current.Application.Lock(); System.Web.HttpContext.Current.Application["Name"] = "Value"; System.Web.HttpContext.Current.Application.UnLock();
会话状态或Cache是更好的select。 他们在MVC中是可以嘲笑的,并且被devise成存储会话和应用程序范围的数据。
静态类似乎是一个stream行的select。 但是,静态类会在您的types之间创build依赖关系,并使版本控制/testing更难。 在一个旨在分解这些types的依赖的框架中使用它也是一个奇怪的模式。 例如,标准的ASP.NET框架充斥着静态和密封types。 这些都被可模仿的实例取代。
“安全”在这方面有点不清楚。 “安全”究竟是什么意思?
我实现了像下面这样的全局状态variables的扩展。 我把网站标题,服务端点,授权angular色
public static class ApplicationStateExtension { public static T GetSetApplicationState<T>(this HttpApplicationState appState, string objectName, object objectValue = null, int syncCheckMinutes = 0) { T retVal = default(T); appState.Lock(); if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes) { appState[objectName + "LastSync"] = DateTime.Now; if (objectValue != null) appState[objectName] = objectValue; } if (appState[objectName] != null) retVal = (T)appState[objectName]; appState.UnLock(); return retVal; } public static object GetSetApplicationState(this HttpApplicationState appState, string objectName, object objectValue = null, int syncCheckMinutes = 0) { object retVal = null; appState.Lock(); if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes) { appState[objectName + "LastSync"] = DateTime.Now; if (objectValue != null) appState[objectName] = objectValue; } if (appState[objectName] != null) retVal = appState[objectName]; appState.UnLock(); return retVal; } public static void SetApplicationState(this HttpApplicationState appState, string objectName, object objectValue, int syncCheckMinutes = 0) { appState.Lock(); if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes) { appState[objectName + "LastSync"] = DateTime.Now; appState[objectName] = objectValue; } appState.UnLock(); } public static object GetApplicationState(this HttpApplicationState appState, string objectName) { object retVal = null; appState.Lock(); if (appState[objectName] != null) retVal = appState[objectName]; appState.UnLock(); return retVal; } public static T GetApplicationState<T>(this HttpApplicationState appState, string objectName) { T retVal = default(T); appState.Lock(); if (appState[objectName] != null) retVal = (T)appState[objectName]; appState.UnLock(); return retVal; } }
所以我可以从Global.asax.cs中设置它们
Application.SetApplicationState("UISiteTitle",paramHelper.GetUIConfigXML<XMLParams.UISiteOptions>("UISiteOptions") .SiteOptionCollection.Where(v => v.name.Equals("title", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().value););
要么
var uiPermissions = Application.GetSetApplicationState<XMLParams.UIPermissions>("UIPermissions", paramHelper.GetUIConfigXML<XMLParams.UIPermissions>("UIPermissions"), 30);
做一个静态类?
他们有应用程序variables吗? 是的,MVC是一个框架,位于正常的asp.net框架之上。
然而,我会创build一个静态类,使用caching存储作为后盾。
您可以像这样在Application_Start
声明应用程序variables:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); var e = "Hello"; Application["value"] = e; }
要在控制器上访问,请写:
string appVar = HttpContext.Application["value"] as string;