Web应用程序中的单例模式

时间:2010-03-07 22:39:47

标签: c# .net design-patterns singleton

我在我的Web应用程序中使用单例模式作为datacontext,因此我不必每次都实例化它,但是我不确定Web应用程序是如何工作的,IIS是否为每个连接的用户打开一个线程?如果是这样,如果我的单例不是线程安全会发生什么?另外,对于datacontext使用单例模式是否可以?感谢。

4 个答案:

答案 0 :(得分:8)

许多人在请求期间保留DataContext,方法是将其保留在HttpContext.Current.Items内。因此,它也是请求的私有。

查看this blogpost by Steve SandersonUnitOfWork patter n。

答案 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执行多层的示例。

http://code.msdn.microsoft.com/multitierlinqtosql