0

正如底部描述的情况(使用Webworms而不是Mvc),

由于我可能需要“掌握” Session 变量的实现,几乎在每个 Web 应用程序中,我都构建了一个专用的类来帮助我轻松管理它。

方法如下

这第一个代码块是供使用的,你可以在下一个代码块看到它正在调用的类

我故意使用拼写错误的名称,以避免歧义(没有任何前缀),..这样我可以在智能感知上发现它更容易。

//'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 的一个实例struct,即“分组”或“捆绑”所有我globals作为一个捆绑包,

因此,当我可能需要存储全局变量时,我会将值分配给CurSesVarStruct必须提供的适当结构变量。

然后,我只需要访问一次会话变量,只提取“变量集合” - object,......因为它实际上是一个会话变量,我保持它的名称不变 -_CurrentSesionGlobals

我尽力描述了背景,但简而言之:

它是作为会话变量之一存储在会话中的结构 - 数据类型 =object 或者您可以说要在会话之间保存的结构的克隆。

所以有了它_CurrentSesionGlobals,我可以通过它从会话中访问我需要的任何值,如下所示:

在将结构存储在之前分配结构Session

CurSesVarStruct.SelectedUercustid = custID;

然后下一个方法 -ExtrctSesnVar()下面,允许我使用例如:

提取上次会话中保存的变量:

custID = ExtractSesnVar().SelectedUercustid;

SelectedUercustid实际上也是结构成员之一。

问题

_CurrentSesionGlobals从会话变量中提取。

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

问题

我怎么能把结果的返回值null

或首先询问我试图提取的object/ a given是否不存在或不存在的条件?Session Variablenull

因为现在有一个异常错误,而我试图获取一个不存在的会话变量的值。

下一个代码块。

这是我添加到解决方案中的一个类,作为每个网站应用程序的助手。

它实际上是一个命名空间。所以负责处理会话变量的类是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

只是不要这样做。

  • 关键:不要将会话(用户)相关数据放在静态变量中。它不是线程安全的。
  • 最佳实践:尽量避免static在 ASP.NET 中使用其他所有内容。
  • struct最佳实践:除了小的、不可变的和无标识的类型之外,不要使用s

看来您对此进行了过度设计。您(现在)所需要的只是为字符串使用一些常量:

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

然后你就可以开始专注于为你的应用增加价值的代码了。

于 2012-12-16T20:56:31.237 回答