0

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

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

块内应该有什么ifif我应该在区块中检查什么条件?我真的不确定我必须做什么。

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

4

2 回答 2

1

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

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

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

于 2012-04-10T16:35:26.593 回答
1

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

但是您的 DAL 可能不仅仅是简单的数据库访问。如果您想将它作为每个会话单独的单例,您必须在第一个请求时创建实例,将其存储到 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"];
        }
    }
}
于 2012-04-10T17:23:18.110 回答