.net - 数据库层设计问题

标签 .net oop c#-4.0

我一直在设计一个数据库访问层,它允许我们在我们的程序中支持多个数据库。最后,我们程序的用户将能够从一系列数据库系统中选择底层数据库系统。一些小客户可能对 MS Access 感到满意,其他人更喜欢 MySql,其他人则喜欢 DB2。这些数据库系统是我现在想要定位的系统。

鉴于这些要求,我想出了一个抽象类 DatabaseConnection。在内部,我使用 System.Data.Common.Data.DbConnection 类,它已经给了我很大的灵活性。
需要具体实例的东西(例如 OleDbCommand 而不是 DbCommand)隐藏在像 CreateDbCommand() 这样的抽象方法中。子类(如 AccessDbConnection)实现这些并提供具体实例。目前,这导致了这种层次结构(为了便于阅读而缩写了类名):

           DatabaseConnection
          /         |        \
 AccessConn     MySqlConn     DB2Conn


但是,有一些特定于底层数据库系统的操作,例如检索所有表名。将抽象方法 GetTableNames() 放入 DatabaseConnection 类并让子类覆盖它感觉是错误的。

我想也许我可以创建另一个名为 DatabaseTools 的抽象基类,在那里声明这些操作,然后在类似于 DatabaseConnection 类的子类的子类中实现它们。这意味着对于 AccessDbConnection,我还有一个类 AccessTools 等:

           DatabaseConnection                      DatabaseTools
          /         |        \                   /       |      \
 AccessConn     MySqlConn     DB2Conn    AccessTools MySqlTools  DB2Tools


不知何故,我对这个想法并不感到兴奋。

你有什么想法来解决这个设计问题?

提前感谢您的时间和答案:)

干杯

基督教

最佳答案

与其使用抽象方法,不如实现一个使用 ANSI 标准 INFORMATION_SCHEMA 检索表名的方法。 View ,然后在 DatabaseConnection 中覆盖它不符合 ANSI 的提供程序的实现?

除此之外,从设计的角度来看,我认为抽象方法方法没有任何问题。

关于.net - 数据库层设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3013612/

相关文章:

swift 虚拟运营商?

c# - 在调用基本构造函数之前计算值

c++ - 具有多个参数的访问者模式

c# - 替换作为属性/公共(public)字段检索的对象列表中的元素

c# - SQL Server - 将 tinyint 与枚举一起使用

c# - 使用 LINQ 提取数据时自动创建正确的对象类

rest - 通过 REST API 将文件附件上传到 ServiceNow 记录

.net - 如何使用 MSBuild 搜索目录结构并获取 .sln 文件名

c# - SQLCommand批量更新查询

asp.net - 在 MVC 3 中使用 DependencyResolver 进行 Controller 实例化时出错