47

我正忙于将 Web 应用程序转换为 MVC,并将一些信息保存到跨多个租户/帐户使用的应用程序变量中,以提高效率。

我意识到 MVC 的重点是让事物尽可能无状态,Session State 显然在 MVC 中拥有和存在是有意义的,但我们不想只是将 Application 转换为 Session 变量,因为我们希望拥有更全局和更安全的东西。MVC 应用程序有应用程序变量吗?我看过一些使用缓存的例子?这是现在的标准吗?与应用程序/会话状态相比,这有多健壮/安全?

4

6 回答 6

103

是的,您可以从 .NET MVC 访问应用程序变量。就是这样:

System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();
于 2010-09-17T07:53:58.650 回答
7

会话状态或缓存是更好的选择。它们在 MVC 中是可模拟的,旨在存储会话和应用程序范围的数据。

静态类在这里似乎是一个流行的选择。然而,静态类会在您的类型之间创建依赖关系,并使版本控制/测试变得更加困难。在旨在分解这些依赖关系的框架中使用它也是一种奇怪的模式。例如,标准的 ASP.NET 框架充满了静态和密封类型。这些都被可模拟的实例所取代。

在这种情况下,“安全”有点不清楚。“安全”到底是什么意思?

于 2010-02-15T14:35:08.117 回答
4

我实现了类似下面的东西作为全局状态变量的扩展。我放了站点标题、服务端点、授权角色之类的东西

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);
于 2013-04-03T17:45:20.933 回答
3

您可以像这样声明应用程序变量Application_Start

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    var e = "Hello";
    Application["value"] = e;
}

要在控制器上访问它,请写入:

string appVar = HttpContext.Application["value"] as string;
于 2017-02-14T09:54:50.823 回答
2

做一个静态类?

于 2010-02-15T14:29:38.210 回答
0

他们有应用程序变量吗?是的,MVC 是一个位于普通 asp.net 框架之上的框架。

但是,我会创建一个使用缓存存储作为支持的静态类。

于 2010-02-15T14:31:59.920 回答