gpt4 book ai didi

asp.net - 将 linq 到 sql datacontext 附加到业务层中的 httpcontext

转载 作者:行者123 更新时间:2023-12-04 10:45:26 24 4
gpt4 key购买 nike

我需要我的 linq to sql 数据上下文在我的业务/数据层中可用,以便我的所有存储库对象进行访问。但是,由于这是一个网络应用程序,我想根据请求创建和销毁它。我想知道是否有一个可以懒惰地创建数据上下文并将其附加到当前 HttpContext 的单例类是否可行。我的问题是:请求结束时数据上下文会自动处理吗?下面是我在想什么的代码。这会实现我的目的:有一个线程安全的 datacontext 实例,它可以懒惰地使用并在请求结束时自动处理吗?

public class SingletonDC
{
public static NorthwindDataContext Default
{
get
{
NorthwindDataContext defaultInstance = (NorthwindDataContext)System.Web.HttpContext.Current.Items["datacontext"];
if (defaultInstance == null)
{
defaultInstance = new NorthwindDataContext();
System.Web.HttpContext.Current.Items.Add("datacontext", defaultInstance);
}
return defaultInstance;
}
}
}

最佳答案

你的想象是有道理的 - 使用 HTTP 请求上下文来存储东西 - 但是 不,当请求结束时,存储在当前 HttpContext 中的一次性对象不会自动神奇地被处理。不知何故,你将不得不自己处理。

有一个“结束请求”事件,您可以轻松 Hook ,例如使用放入 Global.asax.cs 的代码。在您的 Application_EndRequest() 方法中,您可以调用 Dispose()在需要它的列表中的每个对象上手动操作。

一种方法是遍历上下文中的每个项目,测试 IDisposable,然后在适当时调用 Dispose。

protected void Application_EndRequest(Object sender, EventArgs e)
{
foreach (var key in HttpContext.Current.Items.Keys)
{
var disposable = HttpContext.Current.Items[key] as IDisposable;
if (disposable != null)
{
disposable.Dispose();
HttpContext.Current.Items[key] = null;
}
}
}

我认为应该这样做。 ASPNET 不会自动为您执行此操作。当然,在真正的应用程序中使用此代码之前,您需要防止异常等。

Vertigo 的 Keith Craig 写道 a relevant post on the topic a while ago ,将您想要做的事情描述为一种模式,换句话说,一种应该重复的做事方式。他提供了一个类来帮助解决这个问题,延迟加载数据库上下文并将其放入当前上下文。这种方法存在一些缺陷 - 您可以在该帖子的评论讨论中阅读有关它们的信息。评论中还引用了一堆相关文章。

关于asp.net - 将 linq 到 sql datacontext 附加到业务层中的 httpcontext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com