代码之家  ›  专栏  ›  技术社区  ›  theringostarrs

我应该用单人票吗?

  •  1
  • theringostarrs  · 技术社区  · 15 年前

    这是一个半相关的问题,与我刚才提出的以下问题有关:

    Utility classes.. Good or Bad?

    在确定类将用作存储在XML文件中的URL解析规则的缓存之后,我考虑使用单一实例来解决我的问题,但是引入全局状态(尽管它只在一个方向上运行XML->分析器)和静态依赖项。

    导致我考虑单例的设计考虑是:(注意,这是一个Web应用程序,它使用一个模块来捕获和解析使用同一个解析器的所有请求)

    • 我需要缓存存储在XML中的URL解析规则,因此类需要在请求之间挂起。我还有一个方法可以解析给定规则的URL,该规则在httpmodule级别确定请求的路由。

    单例有效吗?你怎么解决这个问题?

    7 回复  |  直到 15 年前
        1
  •  5
  •   Jeff Sternal    15 年前

    不需要一个有所有相关缺点的单身汉( customary anti-singleton link )

    我喜欢把它储存在 HttpContext.Cache . 一些类似的替代方案:

    • 把它储存在 HttpApplication.Application

    • 将属性添加到应用程序类以存储它,然后在相关的 HttpModule ,存储对应用程序的类级引用。

        2
  •  5
  •   zac    15 年前

    我会考虑将规则存储在所有会话都可用的httpContext.cache中。您可以在卸载缓存时重建缓存(由于缺少使用)。

        3
  •  1
  •   Peter    15 年前

    我觉得你的解决方案不错。特别是如果消费代码没有修改数据,那么使用单例类或静态类听起来应该不是问题。我不确定是否有必要给它贴上“单身”的标签,尽管我想这就是它的行为方式。

    您可以使用一个固有的“缓存”静态类,因为它在aspnet工作进程内存中,或者显式地将其缓存到Web缓存中。如果执行后者,则可以通过向缓存项添加文件依赖项来获益,这样任何文件更改都将强制从缓存重新加载。

        4
  •  1
  •   Fredrik Wendt    15 年前

    我不会使用单例,因为这会使应用程序更难测试。大多数IOC容器都可以帮助您用“single(ton)”实例替换这个模式,该实例在所有使用single ton的类之间共享。

        5
  •  0
  •   GraemeF    15 年前

    很容易得到一个IOC容器来为您提供一个单例,我认为使用传统的单例模式是很难证明的。

        6
  •  0
  •   Community CDub    7 年前

    当您可能需要一个对象的多个实例时,单例可以被证明是合理的。术语“singleton”稍微有点误导,因为通常相同的软件设计模式用于控制类的多个实例。

    您可以使用静态类,或者在静态引用上挂起单实例,或者将其存储在ASP.NET Web集合中。单例可以参与将来的继承等等……至于静态类和单例模式,我不讨论这个论点,因为它已经 thoroughly addressed online, even on StackOverflow

        7
  •  0
  •   Alexander Torstling    15 年前

    很快我就会说不,试着把它绑定到“范围”上。如果它在应用程序范围内,则尝试将其与应用程序绑定。如果它是会话绑定的,请将其放入会话等。例如,如果您希望在同一容器中运行2个应用程序,这将帮助您。我对ASP.NET没有经验,但似乎有一个“httpApplicationState”。你能用一下吗?