繁体   English   中英

asp.net MVC有Application变量吗?

[英]Does asp.net MVC have Application variables?

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

我意识到MVC的目的是让事情尽可能无状态,Sesion State显然在MVC中存在并存在,但我们不想将Application转换为Session变量,因为我们宁愿拥有更全局和更安全的东西。 MVC应用程序是否具有应用程序变量? 我看过一些使用缓存的例子? 这是现在的标准吗?与应用程序/会话状态相比,这是多么强大/安全?

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

System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();

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

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

在这种背景下,“安全”有点不清楚。 究竟是什么意思“安全?”

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

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);

做一个静态课?

您可以在Application_Start声明Application变量,如下所示:

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

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

要在控制器上访问此命令:

string appVar = HttpContext.Application["value"] as string;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM