私は、WebアプリケーションをMVCに変換するのに忙しく、いくつかの情報を複数のテナント/アカウントで使用されるアプリケーション変数に保存して、物事をもう少し効率的にしています。
MVCのポイントは物事を可能な限りステートレスに保つことであると理解しています.Sesion Stateは明らかにMVCに存在し、存在する意味がありますが、アプリケーションをセッション変数に変換するだけではなく、よりグローバルで安全なものにする必要があります。 MVCアプリケーションにはアプリケーション変数がありますか?キャッシングが使用される例をいくつか見ましたか?これは現在標準であり、これはアプリケーション/セッション状態と比較してどの程度堅牢/安全ですか?
はい。NETMVCからアプリケーション変数にアクセスできます。方法は次のとおりです。
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
でアプリケーション変数を宣言できます。
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フレームワークの上にあるフレームワークです。
ただし、キャッシュストアをバッキングとして使用する静的クラスを作成します。