单身 - 是有用的

时间:2011-04-09 07:18:29

标签: asp.net singleton

如果我有一个对象作为存储库使用Save(),GetProduct(prod id)等,那么在asp.net应用程序中成为一个单例是个好主意。

我的想法是因为我有很多访问数据库的方法,这样可以提高性能,因为每次都不会重新创建存储库对象。 我在任何样品中都没有看到这样的东西,为什么这是错的呢? 感谢

2 个答案:

答案 0 :(得分:1)

请注意,ASP .net中的单例表示您网站的所有用户都将使用它来访问数据。这意味着您可能必须锁定方法,这可能会导致瓶颈。

我记得有一次我在ASP应用程序中遇到了一个与单例数据管理器有关的真正奇怪的错误。 如果您不希望每次用户请求页面时都重新创建repo,您​​也可以将数据存储库对象放在用户会话中。

答案 1 :(得分:0)

不幸的是,这实际上取决于您访问数据库的方式,以及您的存储库类如何真正抽象数据库连接和事务。

如果您只是谈论为每个http请求创建内存对象的费用,那么这不是什么大问题。这真的不值得考虑。

如果您正在谈论低级数据库的东西,那么它又取决于它。

特别是对于像Linq to SQL或NHibernate这样的ORM,你如何管理他们的会话非常重要。通常你不希望“会话”或“数据文本”的范围超出http请求,所以不,如果单例将数据库会话保持为单例本身,单例就不是一个好主意。

考虑使用IoC Container,如Castle Windsor。然后更改特定classe的“生活方式”(单例,瞬态,每个Web请求等)是一个简单的配置更改,并使您的应用程序更灵活。

另外,与DB本身交谈在内存中创建新对象的成本更高,所以如果你真的在性能之后考虑聪明的缓存。

最后,在考虑单身人士时,从概念的角度考虑而不是表现。这个对象是Singleton是否有意义?