我一直在设计一个数据库访问层,它允许我们在我们的程序中支持多个数据库。最后,我们程序的用户将能够从一系列数据库系统中选择底层数据库系统。一些小客户可能对 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/