数据库层成员应该是静态的还是实例的?

时间:2020-03-05 18:40:45  来源:igfitidea点击:

我见过一些项目,其中DB层中的类仅具有静态函数,而其他项目中则需要实例化这些类才能访问成员函数。

Which is "better" and why?

解决方案

回答

这一切都与数据库层的目的有关。
如果使用实例访问数据库层,则允许该类的多个版本存在。例如,如果要使用同一数据库层来访问多个数据库,则这是理想的。

因此,我们可能会有这样的事情:

DbController acrhive = new DbController("dev");
DbController prod = new DbController("prod");

这使我们可以使用同一类的多个实例来访问不同的数据库。

相反,我们可能希望一次只允许在应用程序内使用一个数据库。如果要执行此操作,则可以考虑为此目的使用静态类。

回答

这取决于我们订阅的型号。 ORM(对象关系模型)或者接口模型。由于nhibernate,LINQ to SQL,实体框架等框架,ORM现在非常流行。使用ORM,我们可以围绕对象模型自定义一些业务约束,并在实际不知道应如何将其提交给数据库的情况下进行传递。与插入,更新和删除有关的所有事情都发生在对象中,而不必太担心开发人员。

像Microsoft流行的企业数据模式这样的接口模型要求我们知道对象处于什么状态以及如何处理它。它还需要我们创建必要的SQL来执行操作。

我会说和ORM一起去。

回答

我希望将单个对象与数据库中的单个记录相关联,即必须实例化一个对象。这是基本ActiveRecord模式。以我的经验,单对象到一行的方法在代码中创建了更加流畅和素养的表示形式。另外,我喜欢将对象视为记录,将类视为表。例如,要更改记录的名称,请执行以下操作:

objPerson = new Person(id)

objPerson.name = "George"

objPerson.save()

让所有住在路易斯安那州的人都可以

aryPeople = Person::getPeopleFromState("LA")

对Active Record的批评很多。当我们在查询数据库中的每条记录或者类与数据库紧密耦合时,尤其会遇到问题,在这两者中都产生了灵活性。在这种情况下,我们可以升级并使用DataMapper之类的工具。

许多现代框架和ORM都意识到了其中的一些缺点,并为它们提供了解决方案。做一些研究,我们会开始发现这是一个有很多解决方案的问题,而这一切都取决于需求。

回答

正如lomaxx提到的,这全都与数据库模型的目的有关。

我发现最好使用静态类,因为我通常只希望创建DAL类的一个实例。我宁愿使用静态方法,也不愿处理可能创建我的DAL类的多个实例的开销,在这种情况下,仅应存在1个可以多次查询的实例。

回答

我要说的是,这取决于我们希望"数据库层"执行的操作...

如果我们有执行存储过程或者sql语句的通用例程返回数据集,那么对我来说使用静态方法更有意义,因为我们不需要永久引用为我们创建数据集的对象。

如果我创建了一个返回强类型的类或者集合作为结果的数据库层,我也将使用静态方法。

另一方面,如果我们想使用给定的参数(例如ID)创建类的实例(请参见@ barret-conrad的答案),以连接到数据库并获取必要的记录,那么我们可能不想在类上使用静态方法。但是即使那样,我仍然会说我们可能会拥有某种DB Helper类,该类的DID具有其他类所依赖的静态方法。

回答

另一个"取决于"。但是,我也可以想到一个非常普通的情况,即静态无法正常工作。如果网站流量不错,并且具有共享连接的静态数据库层,则可能会遇到麻烦。在ASP.Net中,默认情况下会创建一个应用程序实例,因此,如果我们具有静态数据库层,则对于使用网站的每个人,只能获得与数据库的一个连接。