0

状況は下部に記載されているように (Mvc ではなく Webworms を使用)、

おそらく、ほとんどすべての Web アプリケーションでセッション変数の実装を「マスター」する必要があるため、簡単に管理できる専用のクラスを作成しました。

アプローチは次のとおりです

この最初のコード ブロックは使用のためのものです。次のコード ブロックで、それが呼び出しているクラスを確認できます。

あいまいさを避けるために(接頭辞なしで)意図的にスペルミスの名前を使用しています..そして、そのようにIntelliSenseではるかに簡単に見つけることができました。

//'importing' the class for current project
using SeSn = Debug_Tests.Seseions.SeSn;

// creating an object (usually with name related to currentProject)
public static SeSn.CreatCurrentSesionVariablsStructNamed CurSesVarStruct = new Seseions.SeSn.CreatCurrentSesionVariablsStructNamed();

// the long name helps me in this little 'chaos'

これまでのところ、これは a のインスタンスです。つまり、すべてを 1 つのバンドルとしてstruct「グループ化」または「結合」します。globals

そのため、グローバル変数を保存する必要がある場合はいつでも、提供する必要がある適切な構造変数に値を割り当てCurSesVarStructます。

そして、セッション変数に1回アクセスするだけで、「変数コレクション」を抽出するだけです- object、...実際にはセッション変数であるため、名前を一定に保ちます-_CurrentSesionGlobals

背景を説明するために最善を尽くしましたが、要するに:

セッション変数の 1 つとしてセッションに格納されるのは構造体です - データ型 =object または、セッション間で保存される構造体のクローンと言えます。

それを_CurrentSesionGlobals使用することで、次のようにセッションから必要な値にアクセスできます。

に格納する前に構造体を割り当てSessionます。

CurSesVarStruct.SelectedUercustid = custID;

次に、次の方法-ExtrctSesnVar()以下を使用すると、たとえば次のように使用できます。

最後のセッションで保存された変数を抽出します。

custID = ExtractSesnVar().SelectedUercustid;

実際にSelectedUercustidは構造体メンバーの 1 つです。

問題

_CurrentSesionGlobalsセッション変数からの抽出。

public static SeSn.CreatCurrentSesionVariablsStructNamed ExtrctSesnVar()
{
    var CurrAppGlobals = SeSn.GetValueAS.ACloneOfTheStructObj("_CurrentSesionGlobals");
    return (SeSn.CreatCurrentSesionVariablsStructNamed)CurrAppGlobals;
  //the question is refereing this location.
}

質問

結果の戻り値をどのように設定できますか、null

または、抽出しようとしてobjectいる指定された /が存在しないかどうかを最初に尋ねる条件ですか?Session Variablenull

現在、例外エラーが発生していますが、存在しないセッション変数の値を取得しようとしています。

次のコード ブロック .

これは、すべての Web サイト アプリケーションのヘルパーとしてソリューションに追加するクラスです。

それは実際には名前空間です。したがって、セッション変数の処理を担当するクラスはSesn

  namespace Seseions
  {
        public class Sesn
        {
         
            public static bool isNotEmpty()
            {
                return HttpContext.Current.Session.Keys.Count > 0;
            }


            public struct CreatCurrentSesionVariablsStructNamed
            {

                // some of commonly used variables- still testing options..

                public int ManagerCustID;
                public int SelectedUercustid;
                public int recordID;
                public int SelectedMonth;
                public int SelectedChosenWorker;
                public int SelectedYear ;

                
                public string SelectedTable;
                public string SelectedColumn;
                public string SqlSelectCommandLastQuery;
                public string TableOfUsersReference;
                public List<string> Fontlist { get; set; }

            }

            // converts and extract values of session variables

            public class GetValueAS
            {
                public static CreatCurrentSesionVariablsStructNamed ACloneOfTheStructObj(string currntProjectSesVarStructName)
                {
                    if(HttpContext.Current.Session[currntProjectSesVarStructName] != null)
                    return (CreatCurrentSesionVariablsStructNamed)HttpContext.Current.Session[currntProjectSesVarStructName];
                 
                }

                public static int _Int(string SesParameterValToReturn)
                {
                    return Convert.ToInt32(HttpContext.Current.Session[SesParameterValToReturn]);
                }

                public static string _String(string SesParameterValToReturn)
                {
                    return Convert.ToString(HttpContext.Current.Session[SesParameterValToReturn]);
                }
                public static DataSet _DataSet(string SesParameterValToReturn)
                {
                    return (DataSet)HttpContext.Current.Session[SesParameterValToReturn];
                }
                public static DataTable _DataTable(string SesParameterValToReturn)
                {
                    return (DataTable)HttpContext.Current.Session[SesParameterValToReturn];
                }
                public static bool _Bool(string SeSnVarToCheckOn)
                {
                    if (HttpContext.Current.Session[SeSnVarToCheckOn] == null)
                        return false;
                    return (bool)HttpContext.Current.Session[SeSnVarToCheckOn];
                }



            }

            // an easy way to access and mange session variables actions
      public enum Act
      {
                 Add, Remove, Replace
      }
            public static void Modify(Act action, string New_SesnVarName= null, object NewP_Value=null, string Currnt_Ses_SesnVarName=null)
            {
                switch (action)
                {
                    case Act.Remove:
                        if (isNotEmpty())
                            HttpContext.Current.Session.Remove(CurSes_ParamName);
                        break;
                    case Act.Replace:
                         HttpContext.Current.Session.Remove(CurSes_ParamName);
                         HttpContext.Current.Session.Add(New_SesnVarName, NewP_Value);
                        break;

                    case Act.Add:
                        HttpContext.Current.Session.Add(NewQs_SesnVarName, NewP_Value);
                        break;


                }


            }

        }
    }
4

1 に答える 1

3

これをしないでください。

  • 重要: セッション (ユーザー) 関連のデータを静的変数に入れないでください。スレッドセーフではありません。
  • ベスト プラクティス: staticASP.NET では、他のすべてについても回避するようにしてください。
  • ベスト プラクティス: structs は、小さく、不変で、ID のない型以外には使用しないでください。

あなたはこれを過剰に設計しているようです。(今のところ)必要なのは、文字列にいくつかの定数を使用することだけです。

public static class SessionKeys
{
   public const string ManagerCustID = "ManagerCustID";
   ...
}

そして、アプリに価値を付加するコードに集中できるようになります。

于 2012-12-16T20:56:31.237 に答える