我在我的Web应用程序中使用单例模式作为datacontext,因此我不必每次都实例化它,但是我不确定Web应用程序是如何工作的,IIS是否为每个连接的用户打开一个线程?如果是这样,如果我的单例不是线程安全会发生什么?另外,对于datacontext使用单例模式是否可以?感谢。
答案 0 :(得分:8)
许多人在请求期间保留DataContext,方法是将其保留在HttpContext.Current.Items
内。因此,它也是请求的私有。
答案 1 :(得分:7)
每个应用程序域上的所有用户都可以看到静态变量,而不是每个会话。一旦创建,变量将在应用程序域的生命周期内存储在内存中,即使没有对该对象的活动引用。
因此,如果您在Web应用中有某种其他用户不可见的有状态信息,那么它绝对不应该 是静态的。将这种信息存储在用户会话中,或者将静态var转换为如下所示:
public static Data SomeData
{
get
{
if (HttpContext.Session["SomeData"] == null)
HttpContext.Session["SomeData"] = new Data();
return (Data)HttpContext.Session["SomeData"];
}
}
它看起来像一个静态变量,但它的会话是特定的,因此当会话终止时数据被垃圾收集,而其他用户完全看不到它。安全无法保证。
此外,如果你在静态变量中有状态信息,你需要某种类型的同步来修改它,否则你将会遇到解决竞争条件的噩梦。
答案 2 :(得分:1)
@ryudice Web服务器为每个请求创建一个新线程。我认为最好的方法是将datacontext绑定到每个请求,这意味着每次提交请求时都应该创建一个新的datacontext。实现这一目标的一个好方法是使用DI工具,例如StructureMap。这些工具允许您设置所配置实例的生命周期,例如在您的情况下,您可以将XDataContext类配置为HttpContext作用域。
问候。
答案 3 :(得分:0)
以下是Microsoft关于如何使用LINQ-To-SQL执行多层的示例。