我有自己的基于SQL的会话类。我想在程序执行结束时(即在提供页面请求结束时)自动提交会话中的数据。对象析构函数(终结函数)是否在每个请求结束时都没有执行?有没有这样做,而不是每次我完成会话对象时都必须显式调用Dispose()
方法?
答案 0 :(得分:1)
一种可能性是使用global.asax。有一个请求结束的处理程序,在C#中,global.asax.cs中的调用看起来像这样:
protected void Application_EndRequest(object sender, EventArgs e){
//perform action - you have access to the HttpContext
}
您必须注意处理程序的内容 - 根据您的配置,您的资产(样式表,图像等)也可能会遇到此请求,因此您可能需要设计一种方法来确保只有您的页面对他们采取了行动。
答案 1 :(得分:0)
我建议与IOC容器提供商一起使用这些东西。你可以将它们连接起来,直到请求结束并执行一些代码,特别适合某些事务性的东西。
我一直在使用Autofac,它有OnActivated()方法,我用它来挂钩我的事务提交以激活会话。
答案 2 :(得分:0)
在C#中,终结器是非确定性的,这意味着您在执行时没有任何保证。所以,不,你不能将它们用于你的场景。
我认为有两种方法可以解决这个问题:
<强>更新强>
在回答你关于建议#2的问题时,我会稍微阐述一下。此选项将以某种方式允许基于SQL的会话类获得对Web页面实例的引用。一个选项(我将在下面显示)将使用基于SQL的会话类的构造函数来获取对网页的引用。然后,基于SQL的会话类可以注册它想要的任何事件,以便知道页面发生了什么。
namespace SomeNamespace
{
using System.Web.UI;
public class SqlBasedSession
{
public SqlBasedSession(Page webPage)
{
webPage.Unload += new EventHandler(webPage_Unload);
}
void webPage_Unload(object sender, EventArgs e)
{
// the web page is being unloaded so this class can
// cleanup it's resources now
}
}
}
如果仍然不清楚,请告诉我。
答案 3 :(得分:0)
如果你使用显式的Dispose()路由,你的自定义SQL会话类将需要实现IDisposable。
我还建议Russell McClure's answer关于事件。