【问题标题】:Making Database-Class static?使数据库类静态?
【发布时间】:2011-11-15 07:08:23
【问题描述】:

我目前有一个名为“SqlData”的类,其中包含连接到我的 MS-SQL 数据库所需的所有方法。

它包含用于插入、删除和更新不同类型表的方法 - 因此在我的 WPF 应用程序的许多 Windows 中使用。

假设我将近 90% 的 WPF-Windows 都在调用我的 SqlData 方法中的至少三个方法来加载、插入和更新不同的记录...

目前,我需要在每个窗口中实例化我的 Sql-Class - 因此我正在考虑将整个 Class 设为静态,这样我就不需要每次都实例化它?

但我也读过在与 Web 服务或数据库等外部服务器通信时不要使用静态类。

你能给我一些关于我应该怎么做的建议吗?

以下是我的类中使用的一些方法(bool 返回 true,当语句完成时,否则为 false):

公共数据表 GetAllSomething(DataTable _data)

public bool WriteSomething(Object something, out int insertedId)

public bool DeleteSomething(Object something)

谢谢!

【问题讨论】:

  • 尽管我认为人们应该避免使用静态类,但我不得不说有些情况实际上需要它们。例如,对于我的游戏,我有一个在运行时创建和加载的数据库类。该数据库包含所有的武器、物品、能力、事件、脚本、模型等。这个类被我的游戏中的许多不同的类所使用,通过构造函数传递对它的引用将非常丑陋且完全无法维护。通过使用单个静态 GameDatabase,我允许我的整个引擎以一种方式全局访问数据,而无需传递...
  • ...一千个引用只是因为一个类需要查找一次。我最初尝试过,不知道为什么我什至尝试过,因为这太荒谬了。每个类都需要一个额外的变量来保存引用,然后出现了关于如何将引用传递给构造函数管道的问题,即使该方法只需要通过查找等做一件小事。正如你在我的示例中看到的那样,静态类实际上是唯一可维护的解决方案。

标签: c# .net sql class static


【解决方案1】:

目前,我需要在每个窗口中实例化我的 Sql-Class - 因此我正在考虑使整个类静态所以我不 每次都需要实例化吗?

在 .NET 中实例化一个类所花费的时间是如此ridiculously low,您不必担心。就我个人而言,我不使用静态类,因为它们在应用程序的不同层之间引入了强耦合,使得它们更难以单独进行单元测试。

所以我更喜欢将所有数据库访问抽象到一个接口(或抽象类)后面,然后针对特定数据库提供此接口的实现。

【讨论】:

    【解决方案2】:

    只是不要这样做,每次需要时都创建一个类的实例是可以的,这没有什么问题。

    即使您现在还没有这样做,您也可以想象在不久的将来使用某种依赖注入,或者您可以使用 .NET 中可用的任何测试框架编写单元测试,通常您将拥有很多更多没有静态类的选项。

    【讨论】:

      【解决方案3】:

      我总是在我的应用程序开始时创建一个数据库对象,并将它与所有需要它的窗口和类的构造函数一起传递。它使我能够向其中添加数据,例如仅在开始时需要的连接字符串,并且在设置数据库连接之前没有机会调用方法(就像静态一样),因为这是在构造函数。

      【讨论】:

      • 但是为什么不让它静态呢?当您可以只使用静态全局访问器时,听起来您传递了很多引用。您不需要传递那里的参考,因为您的整个应用程序都可以访问它。对于我的游戏,我将所有项目/能力/事件/模型/等保存在一个静态 GameDatabase 类中,该类在游戏开始时创建和加载。数据库被这么多不同的类使用,我无法想象将它传递给每个类的构造函数。
      • 我还应该澄清一下,数据库不会在启动时加载每个项目/模型/能力。我检查索引器是否为空,然后数据库自动加载关联的项目。只是想澄清一下,因为我已经看到有人突然过来指出我的示例的设计缺陷。
      猜你喜欢
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多