我有一种情况需要从查询中检索数据,该查询执行将近半分钟并将其带到网页。 (没有办法减少这个时间,因为已经对它执行了最大量的优化) 我为我的应用程序使用了四层架构以及实体框架(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 文件中指定。这是真的吗?
答案 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"];
}
}
}