【问题标题】:Why would I use static methods for database access为什么我要使用静态方法进行数据库访问
【发布时间】:2014-01-28 18:23:28
【问题描述】:

所以我今天遇到了这个问题,我找不到有意义的解释,在涉及数据库交互时是否有一些非主观的理由使用静态方法。

现在我正在做一个项目,其中一切都是通过存储过程完成的,例如我有一些常规方法,例如:

public void Delete(int clientID)
    {
      //calling store procedure
    }

public void Save(int clientID)
    {
      //calling store procedure
    }

但我也有:

public static Client GetByID(int id)
    {
        //calling stored procedure
    }

public static int AddNew(string firstName, string lastName...)
    {
      //calling store procedure
    }

由于我与.NET 合作了大约 9 个月,而我只使用过Entity FrameworkRepository Pattern,我不记得在任何地方或任何代码中使用了静态方法。不适用于标准的CRUD 操作,也不适用于与数据库相关的更具体的任务。

这是否与访问数据库的特定方式有关,是一些可以提供(甚至非常小的)性能提升的做法,还是只是开发人员的方法,我不应该给它太多想过何时以及何时不在我的数据库相关方法中使用静态方法?

【问题讨论】:

标签: c# database static-methods


【解决方案1】:

在数据访问层的特殊情况下,我会避免使用静态方法,原因很简单……耦合。

静态方法不能实现接口,实例方法可以。通过使用静态方法,本质上是坚持反对对接口进行编码,而是对实现进行编码。因此,使用此数据访问层的所有内容始终需要此特定数据访问层。

没有替代实现,没有测试存根,根本没有依赖倒置。业务逻辑有一个指向基础设施关注点(数据访问层)的依赖箭头,而这应该是相反的。


此外,这似乎至少会带来更大的风险,即在资源处置方面遇到问题。这里可能不是这样,但它真的很容易变成这样。如果某个地方的开发人员有一个聪明的想法,将通用代码行提取到类级静态方法和属性中怎么办?类似ConnectionDBContext 对象?这会产生一些非常有趣且非常难以调试的运行时错误。

另一方面,如果存储库是实例,那么它们可以简单地实现 IDisposable 并确保正确处置任何类级对象。


继续(我想我对设计的反对意见比我想象的要多),从面向对象的角度来看,这感觉对我来说非常违反直觉。也许这只是个人喜好,但这正在将原本是“存储库对象”的东西变成“数据库辅助方法的垃圾场”。

在这样的系统中,我预计随机一次性方法的数量会随着时间的推移而显着增加,因为开发人员会在不考虑整体架构的情况下快速制定解决方案来满足需求。您很可能最终会得到一个臃肿且难以遵循的代码库,而不是一系列一致且管理良好的对象。

【讨论】:

  • 大声笑,好像你已经描述了这个确切的项目。正如您所写的那样,一件事会导致另一件事是多么容易甚至是不引人注意的事情给我留下了深刻的印象,最终出现在@ 987654324@中。我会多读几遍你的答案,这真的很好。谢谢。
  • 很棒的答案,并且非常完美地描述了我在尝试将单元测试添加到我接管的现有 Web 应用程序项目时的确切痛苦。我一定会继续使用这个答案!
【解决方案2】:

当没有状态或共享状态时使用静态方法。如果您的代码只是调用存储过程,那么它可能除了共享数据库连接字符串之外没有任何状态。这将是对静态方法的有效使用。

【讨论】:

  • 嗯,当然,这些方法是静态的没有问题,但我想知道是否有比使其成为静态的能力更重要的原因。它工作正常,但据我所见,这是我第一次看到有人将这种方法设为静态,根据我的经验,这不是常见的做法。但当然我也可能是错的,所以我问..
  • +1 提到调用存储过程可能导致唯一的共享数据是连接字符串。我们在我们的软件中使用它来保持数据的一致性和安全性。
【解决方案3】:

我认为你的最后一句话是正确的;它只是以前的开发人员方法。

不过,我要说的是,让这些方法静态化会让您的生活成为创建可测试产品的噩梦;如果您有能力将它们更改为基于实例并创建一组可以通过模拟测试应用程序而不需要数据库的单元测试,那么从长远来看,它会让您的生活更轻松。

【讨论】:

  • 我们不能从发布的示例中确定,但如果这些方法只是调用存储过程,那么这里可能没有什么可以测试或没有什么可以模拟的。
【解决方案4】:

我们在公司很少使用它们,尽管它们可以在实用程序类或简单调用函数的东西中发挥作用。根据您期望的非静态类的实例数量,它们也会影响性能。但这需要有显着的实例差异。

来源 - MSDN

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2010-09-29
    • 2017-09-28
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多