静态和单体类之间的区别c#OOPS

时间:2014-04-04 14:45:28

标签: c# .net oop singleton

我在寻找singleton& amp;静态类,我在this question中发现了许多不同之处。但是,其中一些对我来说不是很清楚:

  

[...]单例可以扩展类和实现接口,而静态类则不能   (它可以扩展类,但不会继承它们的实例成员)。 {source按{neil.johnson}

  

[单身人士有]能够返回派生类型(作为延迟加载和界面实现的组合)[source Tilak]

这两点意味着什么?

有些人说他们使用单例设计模式进行数据库连接,因此整个应用程序中只存在一个连接,并且这个单一连接用于所有请求。单个连接可以处理多个与数据库相关的请求吗?

如果我们应该遵循数据库连接处理的单例模式,请指导我。如果没有,那么请写下所有专业人士和利弊。感谢

2 个答案:

答案 0 :(得分:3)

回答你的问题:

  1. 单身人士是第一个对象。因此,所有继承内容也适用于它们。另一方面,静态类只是静态函数(和静态)的容器。由于静态成员在子类型类型时将继承,因此它们根本不会从继承中受益。接口也不允许指定静态成员,因此不能将它们用于静态类。
  2. “返回派生类型的能力”是单例是对象这一事实的直接暗示。作为对象,您可以将它们传递给方法或从方法返回它们。这意味着使用这些单例对象的方法实际上并不需要知道它们正在使用单例。除此之外,您还可以使用接口类型而不是具体的单例类型。这允许松散耦合,并且通常使代码更加健壮,因为您可以通过提供相同功能的其他对象(通过实现接口)轻松地交换该单例对象。因此,从长远来看,这是摆脱单身人士的好方法,并使用dependency injection之类的内容作为inversion of control的形式。
  3. 对于数据库连接,使用单例来维护在任何地方重用的永久连接确实有某种意义。但是,.NET框架中通常有一种不同的方法:该方法涉及短期生存连接,这种连接仅用于实际需要数据库连接的非常短的持续时间。因此,不是始终保持连接处于活动状态,而是创建连接,执行查询并立即关闭连接。

    当然,永久打开和关闭数据库连接存在一些缺点。为了弥补这一点,.NET框架使用了一种池化策略,可以通过非常小的开销快速“创建”大量连接。因此,不是从头开始实际创建真正的连接,而是从连接池获得现有连接,使用它,然后将其释放回连接池。

    // create a new connection
    using (var connection = new SqlConnection())
    {
         // work with the connection
         doSomethingWith(connection);
    }
    // connection is now automatically closed and returned to the connection pool
    

答案 1 :(得分:1)

不要使用单例进行数据库连接。可能根本不使用单身人士,他们严重过度使用,提供的利益很少,并且自己造成麻烦。如果你真的想要使用单身人士,那就不要因为这很困难而让你更加困难。使用依赖注入通常是解决问题的更好方法。

如果您使用Microsoft SQL Server .NET为您管理连接池[1],并且通常没有充分的理由您必须关心创建,销毁和重用与服务器的连接的详细信息。

Microsoft SQL Server 2005及更高版本支持多个活动结果集(MARS)[2],因此您确实可以使用相同的连接运行多个查询。

其他数据库显然会有所不同。我可以详细说明具体的问题,但关于静态类,单例,资源定位器和依赖注入的整个事情只是在一个答案中处理。

[1] http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

[2] http://msdn.microsoft.com/en-us/library/cfa084cz.aspx