我正在使用linq to sql,因此需要存储我的DataContext以供将来用于每个线程(我已经读过这篇文章:http://www.west-wind.com/weblog/posts/246222.aspx 关于实现共享上下文的方法)。我想知道的是,我如何创建一个global.asax文件都知道的单一密钥,如果没有硬编码就会知道网页,如果我对它进行硬编码,密钥必须是针对每个用户的。
非常感谢!
Vondiplo
答案 0 :(得分:1)
您是否考虑过Castle.Windsor框架中的IContainerAccessor?
然后你可以做类似
的事情 public class GlobalApplication : System.Web.HttpApplication, IContainerAccessor
{
private static readonly WindsorContainer _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
public IWindsorContainer Container
{
get { return _container; }
}
}
通过整个应用程序可以访问Container,例如
var accessor = HttpContext.Current.ApplicationInstance as IContainerAccessor;
var controller = accessor.Container.Resolve<IDataContext>("myDataContext");
这需要对Castle Windsor及其IoC功能进行一些研究,但是它们对你非常有用。
答案 1 :(得分:0)
听起来你想看Page.Cache
。这是一个在应用程序级别可用的集合。它适用于所有用户的所有会话。
答案 2 :(得分:0)
将DataContext添加到请求范围:
在global.asax.cs中:
HttpContext.Current.Items["HardcodedKey"] = dataContext;
在页面中:
DataContext dc = (DataContext) HttpContext.Current.Items["HardcodedKey"];
.Items集合的范围限定为单个请求,因此对于给定的键,每个请求都将引用不同的项。
答案 3 :(得分:0)
不确定为什么你不能在Global.asax中使用会话 - 你只需要确保你从正确的地方调用它。
默认情况下,Global.asax中的内容非常少,但是如果需要,可以实现number of methods,并且您可能需要(本地测试)< / EM>:
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
// Pick up your session id here, create a new context and away you go?
var sessionId = Session.SessionID;
Session.Add("sessionId", sessionId);
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
// Noting comment above, clean up your context if needs be.
}
然后在您的网站中,您可以拥有以下内容:
protected void Page_Load(object sender, EventArgs e)
{
Literal1.Text = Session["sessionId"].ToString();
}
我不确定Session是否适合您存储,并且您需要进行一些性能测试,以确定它是否能够处理您期望的各种负载。