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

Kev*_*ock 10 c# asp.net class-design data-access-layer

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

任何人都可以提供一些关于这两种方法的优点/缺点,特别是在ASP.NET应用程序中使用ADO.NET提供程序(无ORM)开发数据访问类.如果您有更一般的静态与实例类技巧,请随意加入.

特别是,我担心的问题是:

  1. 线程和并发
  2. 可扩展性
  3. 性能
  4. 任何其他未知数

谢谢!

Ree*_*sey 12

基于静态的方法通常只有一个,而且只有一个主要优点:它们易于实现.

基于实例的方法赢得了:

  1. 线程和并发 - 您不需要任何/同步,因此您可以获得更好的吞吐量
  2. 可伸缩性 - 与上述问题相同
  3. 逆足 - 与上述问题相同
  4. 可测试性 - 这更容易测试,因为模拟实例很容易,测试静态类很麻烦

静态方法可以赢得:

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

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


Gab*_*ams 5

我的一般感觉是:为什么要实例化,如果你没有?

当对多个实例没有任何用处并且不需要实例成员时,我使用静态类.至于DAL,重点是只有一个.如果它没有价值,为什么要实例化呢?

看看这个链接,它表明静态方法调用比实例类方法调用更快.

此链接显示使用静态类的一个优点是编译器可以检查以确保不会意外添加实例成员.

此链接显示静态类可以用作方便的容器集合,这些方法只对输入参数进行操作,而不必获取或设置任何内部实例字段.对于DAL,这正是您所拥有的.没有理由创建任何内部实例字段,因此没有理由进行实例化.

  • 主要的缺点(我已经看到它发生了很多次):随着时间的推移,事情变得越来越复杂,你最终会得到一个巨大的单片方法,因为所有的状态都必须作为方法args传递,因为你不能(实际上)使用用于在多线程应用程序中存储状态的静态字段.随着复杂性和深度的增长,人们变得懒惰,而不是在新方法中封装某些内容,所有内容都被填充内联,复制,粘贴,循环等.实例方法也会发生同样的事情,但是使用实例字段重构会更容易/属性. (3认同)
  • @Nitz:这听起来像是糟糕的开发实践和缺乏代码审查的缺点. (2认同)