47

WebアプリケーションをMVCに変換するのに忙しく、いくつかの情報をアプリケーション変数に保存して、複数のテナント/アカウントで使用して、作業を少し効率的にしています。

MVCのポイントは、物事を可能な限りステートレスに保つことです。SesionStateは、MVCに存在することは明らかであり、存在しますが、よりグローバルで安全なものが必要なため、アプリケーションをセッション変数に変換するだけでは不十分です。MVCアプリケーションにはアプリケーション変数がありますか?キャッシングが使用されている例を見たことがありますか?これは現在標準であり、アプリケーション/セッション状態と比較してどれほど堅牢/安全ですか?

4

6 に答える 6

103

はい、.NETMVCからアプリケーション変数にアクセスできます。方法は次のとおりです。

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 に答える