繁体   English   中英

session state 变量和 singleton class

[英]session state variables and singleton class

我有一种情况,我需要从执行将近半分钟的查询中检索数据并将其带到 web 页面。 (没有办法减少这个时间,因为已经对其执行了最大量的优化)我为我的应用程序使用四层架构和实体框架(EF、数据访问层、业务逻辑层、UI)。 我正在尝试在创建DAL的实例时使用 singleton 方法(DAL 反过来从数据库中检索数据),以便我能够重新使用该实例,因此不会在同一个实例中创建其他实例session go如何设置session state并查看State Server中实例的可用性?

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

什么应该驻留在if块中? 我应该在if块中检查什么条件? 我真的不确定我必须做什么。

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

在我看来你有一个适合依赖注入的定义明确的架构。 使用 DI 你可以让你的 IOC 容器返回一个 singleton object 或一个临时的。 但是,在 web 环境中使用单例时要非常小心,因为它们通常会造成比其价值更多的麻烦。

如果您正在运行的查询包含用户特定的数据,那么我可能会将该查询的结果放入构成应用程序 UI 部分的代码中的 session 中,如果您使用的是像 MVC 这样的模式,它会在 controller 或 MVP 中主持人。

如果不使用这些模式,那么您可以考虑将信息放入业务层内的 session,但前提是您包装 session 并将该依赖项注入您的业务 object,例如“IUserSession”。 业务项目不应包含对“system.Web”或类似内容的引用。

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

但是您的 DAL 可能不仅仅是简单的数据库访问。 如果你想将它作为一个 singleton 单独用于每个 session 你必须在第一次请求时创建实例,将它存储到 Session 并在使用前检查它是否存在。 有了线程安全,代码可能看起来像这样:

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"];
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM