保持站点类的最佳实践

时间:2008-12-03 05:41:19

标签: c# asp.net session facade

我正在构建一个Web应用程序,它使用外部构建的类来处理站点的大部分工作和规则。大多数页面都需要访问此类才能获得需要显示的信息。在过去,我会将这样的类放在会话变量中,因此在需要时可以轻松访问它,而不需要不断地重新实例化。

第一个问题,将这个类填入会话变量(这不是很大)这是一个坏主意吗?

第二个问题,如果在会话中存储站点应用程序层类并不是一个坏主意,那么我是否可以编写一个集中方法来使用该类来获取或将类存储到会话中?我不希望在页面获取类之后使用一堆重复的代码页,检查它,创建它是否等等。

3 个答案:

答案 0 :(得分:3)

在决定在哪里存储课程之前,您必须回答两个问题:

  1. 这堂课应该活多久?
  2. 在哪个范围内可见?
  3. 回答这两个问题的示例:请求,用户会话,应用程序。

    如果这个类是无状态的(没有数据,只有逻辑),那么它可能在期间生存 一生的应用。如果这只是每个用户唯一的数据(不应在每个请求上重新加载),那么您可以将其直接放入会话并跳过以下段落。

    现在,在你决定了生命长度后,你有几个解决方案。生活方式管理的最佳解决方案是IoC容器。更简单的解决方案是抽象存储并使用静态外观,如Current.MyClass,其中MyClass实例存储在请求,会话或应用程序中,具体取决于为Current提供的存储空间。

    但是,您不应该在指定的类中实现单例,因为它本身不应该决定您需要多少实例,并且如果需要,它会限制您使用具有相同接口的另一个类进行替换。

答案 1 :(得分:0)

在不知道您使用的任何框架的情况下,将类放入会话存储区似乎不太明智 - 每个用户将复制一次 - 除非它具有该用户独有的数据。

我能给出的最好的建议是拥有一个单独的类(你可以谷歌它 - 这是一个设计模式),然后在该类中有一个函数将返回你需要的类,或者如果它创建它还不存在。

答案 2 :(得分:0)

如果班级应该首先存储在会话中,那么评审团仍然没有参加。随着应用程序我问了这个问题,我选择不把课程填入课程,这真的没有必要,我很懒。使用这种方法来管理会话是值得的,因为它在网络开发中已经困扰了我一段时间。

我的研究成果是编写一个静态类来管理我的会话变量。此类处理对会话的所有读取和写入,并使它们都保持强类型,以便我进行引导。它一直困扰着我使用重复的代码来处理会话垃圾。保持拼写错误。

我发现有两篇我喜欢的文章,我现在只能找到其中一篇,当我找到它时会包含另一篇。

第一次是Code Project 这可能是第二个link

模式简单直接。我还为从url查询字符串中获取参数的请求构建了一个类。我认为没有理由不把它扩展到cookie。

这是我第一次使用该模式,我只使用字符串,因此私有方法有点受限,但可以很容易地将其更改为使用任何类或基本类型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;

namespace BDZipper.Site
{
    /// <summary>
    /// This class maintains all session variables for us instead of handeling them 
    /// individually in the session.  They are also strongly typed.
    /// </summary>
    public static class SessionManager
    {

        # region Private Constants
        // Define string constant for each property.  We use the constant to call the session variable
        // easier not to make mistakes this way.
        // I think for simplicity, we will use the same key string in the web.config AppSettings as
        // we do for the session variable.  This way we can use the same constant for both!
        private const string startDirectory = "StartDirectory";
        private const string currentDirectory = "CurrentDirectory";

        # endregion

        /// <summary>
        /// The starting directory for the application
        /// </summary>
        public static string StartDirectory
        {
            get
            {
                return GetSessionValue(startDirectory, true);
            }
            //set
            //{
            //    HttpContext.Current.Session[startDirectory] = value;
            //}
        }

        public static string CurrentDirectory
        {
            get
            {
                return GetSessionValue(currentDirectory, false);
            }
            set
            {
                HttpContext.Current.Session[currentDirectory] = value;
            }
        }
        //TODO: Update to use any class or type
        /// <summary>
        /// Handles routine of getting values out of session and or AppSettings
        /// </summary>
        /// <param name="SessionVar"></param>
        /// <param name="IsAppSetting"></param>
        /// <returns></returns>
        private static string GetSessionValue(string SessionVar, bool IsAppSetting)
        {
            if (null != HttpContext.Current.Session[SessionVar])
                return (string)HttpContext.Current.Session[SessionVar];
            else if (IsAppSetting)  // Session null with appSetting value
                return ConfigurationManager.AppSettings[SessionVar];
            else
                return "";
        }
    }
}