Я разрабатываю слой доступа к базам данных, который позволяет нам поддерживать несколько баз данных в наших программах. В конце концов, пользователи наших программ смогут выбрать базовую систему баз данных из ряда систем баз данных. Некоторые маленькие клиенты могут быть довольны 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
Каким-то образом я не в восторге от этой идеи.
Какие идеи у вас есть, чтобы решить эту проблему дизайна?
Заранее спасибо за ваше время и ответы :) 1020 *
Приветствия
Christian