C# 在web应用程序中选择静态和实例数据访问类的优缺点是什么?

C# 在web应用程序中选择静态和实例数据访问类的优缺点是什么?,c#,asp.net,class-design,data-access-layer,C#,Asp.net,Class Design,Data Access Layer,我已经阅读了关于这个主题的其他几个问题(,和),但还没有找到一个很好的答案。我以前开发过相当多的数据访问层,我个人更喜欢使用实例类而不是静态类。然而,这更多的是个人偏好(我喜欢测试我的业务对象,这种方法使模拟DAL更容易)。我以前使用过静态类来访问数据库,但对于这种设计的适当性(特别是在ASP.NET环境中),我总是感到有点不安全 对于使用ADO.NET提供程序(无ORM)开发数据访问类的这两种方法,特别是在ASP.NET应用程序中,有谁能提供一些好的优缺点吗。如果您还有一些更一般的静态类与实例

我已经阅读了关于这个主题的其他几个问题(,和),但还没有找到一个很好的答案。我以前开发过相当多的数据访问层,我个人更喜欢使用实例类而不是静态类。然而,这更多的是个人偏好(我喜欢测试我的业务对象,这种方法使模拟DAL更容易)。我以前使用过静态类来访问数据库,但对于这种设计的适当性(特别是在ASP.NET环境中),我总是感到有点不安全

对于使用ADO.NET提供程序(无ORM)开发数据访问类的这两种方法,特别是在ASP.NET应用程序中,有谁能提供一些好的优缺点吗。如果您还有一些更一般的静态类与实例类的技巧,请随时加入

我特别关注的问题是:

  • 线程与并发
  • 可伸缩性
  • 演出
  • 还有其他未知数吗

  • 谢谢

    我的总体感觉是:如果不需要,为什么要实例化

    当不需要多个实例并且不需要实例成员时,我使用静态类。至于DAL,关键是只有一个。如果没有价值,为什么要实例化它

    请看,这表明静态方法调用比实例类方法调用快

    显示使用静态类的一个优点是编译器可以检查以确保没有意外添加实例成员


    显示了静态类可以用作一个方便的容器,用于存放只对输入参数进行操作的方法集,而不必获取或设置任何内部实例字段。对于DAL来说,这正是你所拥有的。没有理由创建任何内部实例字段,因此也没有理由进行实例化。

    基于静态的方法通常只有一个主要优点:易于实现

    基于实例的方法赢得:

  • 线程和并发性—您不需要任何/同样多的同步,因此可以获得更好的吞吐量
  • 可伸缩性-与上述问题相同
  • 性能。-同上
  • 可测试性——这更容易测试,因为模拟实例很容易,测试静态类也很麻烦
  • 静态方法可以在以下方面获胜:

  • 内存-您只有一个实例,因此占用空间更小
  • 一致性/共享—很容易保持单个实例与自身的一致性

  • 总的来说,我觉得基于实例的方法更优越。如果您要扩展到单个服务器之外,这一点就变得更为重要,因为一旦您开始在多台机器上实例化它,静态方法就会“中断”…

    我已经使用静态DAL多年了,我同意您的担忧。线程和并发是最具挑战性的,在我的例子中,我将不同的连接对象存储在线程静态结构中。事实证明,它具有很好的可扩展性和性能,更重要的是,现在我正在将PropertyInfo转换为PropertyDescriptor,这为我提供了与反射相同的好处和更好的性能。在我的DAL中,我只需写下:

     List<Entity> tableRows = SQL.Read(new SearchCriteria(), new Table());
    
    List tableRows=SQL.Read(new SearchCriteria(),new Table());
    

    一切都是从SQL静态类派生出来的,这使我的代码更加简单。

    对我来说,主要原因是我不需要保留DAL对象的状态。它使用的对象的状态不跨越它们所嵌入的方法的范围。这样,如果一个对象的多个实例都相同,为什么还要保留它们

    使用最新版本的ADO.NET,在调用范围内创建和销毁与数据库的连接,并让ConnectionPool处理整个连接可重用性问题似乎是最佳做法

    同样,在最新版本的.NET Framework中,TransactionScope(这将是您自己管理连接的一个原因)上升到业务级别,允许您在同一范围内加入对DAL的多个调用


    因此,我看不到强制创建和销毁(或缓存)DAL实例的情况。

    实例化有很多价值。我个人的感觉正好相反:只有在有令人信服的理由静态处理类型/数据/方法/等时,才使用静态。我的总体感觉是:为什么在不需要时将其设置为静态?主要的缺点(我已经看到过很多次):随着时间的推移,事情变得越来越复杂,您最终会使用大型单片方法,因为您的所有状态都必须作为方法参数传递,因为您(实际上)不能在多线程应用程序中使用静态字段来存储状态。随着复杂性和深度的增长,人们变得懒惰,而不是用新方法封装某些东西,所有东西都被内联、复制、粘贴、循环等填充。同样的事情也可能发生在实例方法中,但用实例字段/属性重构要容易得多。@Nitz:这听起来像是糟糕的开发实践的一个缺点,加布里埃尔·麦克亚当斯:除了非常简单的实用程序类(即System.Math),静态类还有很多缺点。在线程化场景中,它们往往更加困难,因为您需要额外的锁定。当您需要进行复杂的测试时(对于DAL来说非常重要),它们更难测试,也更难模拟。它们不太灵活,因为它们破坏了多态性。基本上,静态类将您锁定在固定的、僵化的设计中——在大多数情况下,创建非静态类要干净得多。最坏的情况是,如果你真的想要静态的话,考虑一个单一的……我认为利弊远远大于弊,至少在我看来。至于内存消耗,我认为在大多数应用程序中,这可能是一个可以忽略不计的缺点。@Kevin Babcock: