【发布时间】:2013-12-20 15:40:06
【问题描述】:
这是基本问题。假设我有一个基类 Foo。这个类调用数据库来获取一些数据缓存在类中。
public class Foo
{
// Properties/fields go here.
public virtual void ReadData()
{
// Queries the database for information and stores it in Foo.
}
}
现在,假设我有一个名为 Bar 的派生类。这个类想要缓存一些额外的数据。
public class Bar : Foo
{
// Additional properties/fields go here.
public override void ReadData()
{
base.ReadData();
// Queries the database for additional information and stores it in Bar.
}
}
现在,看看这个,如果您正在执行常规 OOP,这似乎是一件很常见的事情。但是,在这种情况下,您访问数据库两次,效率很低。我正在开发一个遗留代码库,该代码库在所有地方都进行了这样的实践。在下一个版本中,他们希望优化数据库访问(意味着减少对数据库的调用)。
是否存在适用于 OOP 的数据库访问设计模式,以便我可以最大限度地减少数据库上的查询量?
【问题讨论】:
-
您的示例没有显示它两次访问数据库的位置/方式。恕我直言,仅凭 cmets 无法知道真正发生了什么,以及是否(以及如何)可以减少
-
只是不要调用base.ReadData?但是做一个组合的 SQL 呢?
-
我会研究组合的概念,其中 ReadData() 方法通过两种不同的实现被推入它自己的 IDataReader 接口。然后你可以互换使用 Foo 或 Bar 中的那些。此外,通常您希望方法尽可能小,这有利于这种方法。基本上,如果你能想象以两种或多种不同的方式做某事,它应该是一个接口而不是继承。
-
@Jason 用于查询数据库的 cmets 包括打开 SqlConnection、创建 SqlCommand、在命令上调用 ExecuteReader(),然后在 SqlDataReader 上调用 Read。因此,在 Foo.ReadData 和 Bar.ReadData 中,它们都在打开一个新连接并创建一个新命令、获取数据并存储它。
-
我是否正确地假设使用 ORM(这会从这些类中完全删除 SQL 访问代码)不是一种选择?
标签: c# sql database oop design-patterns