会话状态变量和单例类

时间:2012-04-10 15:37:52

标签: c# asp.net .net singleton session-state

我有一种情况需要从查询中检索数据,该查询执行将近半分钟并将其带到网页。 (没有办法减少这个时间,因为已经对它执行了最大量的优化) 我为我的应用程序使用了四层架构以及实体框架(EF,数据访问层,Biz逻辑层,UI)。 我正在尝试使用单例方法创建 DAL 的实例(DAL依次从数据库中检索数据),以便我能够重新使用此实例,从而增加实例不会在同一会话中创建。 如何在State Server中设置会话状态并检查实例的可用性?

public static Singleton getInstance() {
     if (**instance == null**)
       instance = new Singleton();
     return instance;
   }

if区块应该包含哪些内容?我应该在if区块检查什么条件?我真的不确定我必须做什么。

PS:此会话必须超时5分钟。我听说可以在 Web.config 文件中指定。这是真的吗?

2 个答案:

答案 0 :(得分:1)

听起来我觉得你有一个很好的架构,适合依赖注入。使用DI你可以让你的IOC容器返回单个对象或瞬态对象。但是,在网络环境中使用单身时要非常小心,因为它们经常会造成比它们更值钱的麻烦。

如果您运行的查询包含特定于用户的数据,那么我可能会将该查询的结果放入构成应用程序UI部分的代码中的会话中,如果您使用的是MVC之类的模式将在控制器中或演示者中的MVP。

如果这些模式未被使用,那么您可以考虑将信息放入业务层内的会话中,但前提是您完成会话并将该依赖项注入业务对象,例如:像“IUserSession”之类的东西。业务项目不应包含对“system.Web”或类似内容的引用。

答案 1 :(得分:1)

说实话,您应该使用Entity Framework上下文,并在每次需要访问数据库时创建它,即在每种方法中。它被优化为以这种方式使用。连接池将确保每次重新创建EF上下文时不会受到惩罚。这是最好的做法。

但是你的DAL可能不仅仅是简单的数据库访问。如果您希望将它作为每个会话的单独单独使用,则必须在第一个请求上创建实例,将其存储到会话中并在使用之前检查它是否存在。通过线程安全,代码看起来像:

class DALClass
{
    private static object instanceLock = new object();

    public static DALClass Instance
    {
        get
        {
            if (Session["DALInstance"] == null)
            {
                lock (instanceLock)
                {
                    if (Session["DALInstance"] == null)
                    {
                        Session["DALInstance"] = new DALClass();
                    }
                }
            }

            return (DALClass)Session["DALInstance"];
        }
    }
}