2009-11-04 49 views
1

这是一个半相关的问题质疑下列问题,我只是提出:我应该使用单身吗?

Utility classes.. Good or Bad?

确定一类是作为URL分析存储在XML文件规则高速缓存之后,我已经考虑过一个单例会解决我的问题,但引入全局状态(尽管它只向一个方向传递XML - >解析器)和静态依赖关系。

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

  • 我需要缓存URL解析规则存储在XML中,所以这个类需要在请求之间挂起。我也有一个解析Url的方法,给定规则,它决定了HttpModule级别请求的路由。

在这种情况下单身人士有效吗?你会如何解决这个问题?

回答

5

没有必要为单身人士提供所有相关的缺点(customary anti-singleton link)。

我喜欢将它存储在HttpContext.Cache中的建议。一些类似的替代品:

  • 储存于HttpApplication.Application

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

+2

当数据需要存储更长时间时,HttpContext.Cache可能会无法预测,因为它会自动刷新。而HttpApplication.Application将在应用程序请求的整个生命周期中保留它的数据。 – Mez 2009-11-04 20:54:30

1

您的解决方案听起来不错。特别是如果消费代码没有修改数据,那么使用单例或静态类听起来应该不是问题。我不确定是否需要将它标记为“单身人士”是必要的,但我想这是它的表现。

您可以使用静态类,它本质上是“缓存”的,因为它位于ASPNET工作进程内存中,或者您可以将其显式缓存到Web缓存中。如果您使用后者,则可以通过向缓存条目添加文件依赖项来获益,因此任何文件更改都会强制缓存中的重新加载。

5

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

0

让IoC容器为你提供一个单例很容易,我认为很难证明使用传统的Singleton模式是合理的。

0

只要您需要一个以上的对象实例,就可以证明单身人士是合理的。术语“singleton”有点误导,因为通常使用相同的软件设计模式来控制一个类的多个实例。

您可以使用静态类,也可以将单例实例挂在静态引用上,或将其存储在其中一个asp.net web集合中。单身人士可以参加未来的继承等等等等...至于静态类与单身模式,我不参与这个论点,因为它已经thoroughly addressed online, even on StackOverflow

+0

其实我更喜欢zac有关存储在HttpContext.Cache中的答案 - 它是特定的和有用的。 – 2009-11-04 20:20:05

0

只是很快我会说不,只是尝试绑定它是'范围'。如果它在整个应用程序中,则尝试将其与应用程序绑定。如果是会话绑定,则将其放入会话中等。如果您想要在同一个容器中运行2个应用程序,这可以帮助您。我没有ASP.NET的经验,但似乎有一个'HttpApplicationState'。你能用那个吗?

1

我不会使用单例,因为这使得应用程序难以测试。大多数IoC容器可以帮助你用所有可能使用单例的类共享的“单一(吨)”实例替换这种模式。