我一直在设计一个数据库访问层,允许我们在程序中支持多个数据库.最后,我们程序的用户应该能够从一系列数据库系统中选择底层数据库系统.一些小客户可能对MS Access感到满意,其他人更喜欢MySql,其他人更喜欢DB2.那些db系统是我现在想要的目标.
鉴于这些要求,我想出了一个抽象类DatabaseConnection.在内部,我使用System.Data.Common.Data.DbConnection类,这已经给了我很大的灵活性.
需要具体实例的东西(例如OleDbCommand而不是DbCommand)隐藏在CreateDbCommand()等抽象方法中.子类(如AccessDbConnection)实现这些并提供具体实例.目前,这导致了这种层次结构(类名缩写为可读性):
Run Code Online (Sandbox Code Playgroud)DatabaseConnection / | \ AccessConn MySqlConn DB2Conn
但是,有一些特定于底层数据库系统的操作,例如检索所有表名.将抽象方法GetTableNames()放入DatabaseConnection类并让子类覆盖它是错误的.
我想也许我可以创建另一个名为DatabaseTools的抽象基类,在那里声明那些操作,然后在类似于DatabaseConnection类的子类的子类中实现它们.这意味着对于AccessDbConnection,我还有一个类AccessTools等等:
Run Code Online (Sandbox Code Playgroud)DatabaseConnection DatabaseTools / | \ / | \ AccessConn MySqlConn DB2Conn AccessTools MySqlTools DB2Tools
不知何故,我对这个想法并不感到激动.
您有什么想法来解决这个设计问题?
在此先感谢您的时间和答案:)
干杯
基督教
由于拥有 100% OO 纯度不会获得积分,所以请遵循 Swingline Rage 的建议。您也可以通过重命名该类来使其变得纯粹;-)
唯一的问题是,如果您使用接口而不是抽象类和继承,您就不太可能被烧毁。接口可以相互继承,但您可能不需要它。写起来有点困难,但你可以以同样的方式使用它们。
http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx
接口或抽象类:使用哪一个?
“基类中的共享代码怎么样?” - 如果您使用静态类并调用它们,您可以保持DRY(在 OO 中使用某些过程技术并不是罪过)。上面的堆栈溢出主题中的 Q#2 看起来很有趣,但我不能保证它。
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |