Предположим, у меня есть один абстрактный класс, например, DatabaseConnection с 3 РЕФЕРАТ методы Openconnection
, Executequery
, closeconnection
.
Этот класс DatabaseConnection
наследуется разными классами, чтобы установить соединение с сервером mysql, oracle, sql... Так как же структура унаследованной классы?
и каков наилучший способ создания экземпляра производного класса, который увеличивает ремонтопригодность и повторное использование кода?
Если у вас есть абстрактный класс:
public abstract class DatabaseConnection
{
public DatabaseConnection(...) // Optional if you want a base constructor
with or without required parameters.
public abstract void OpenConnection();
...
}
Тогда реализация просто должна переопределить все:
public class SQLServerDatabaseConnection : DatabaseConnection
{
public SQLServerDatabaseConnection(...) //Whatever params you want
//Or public SQLServerDatabaseConnection(...) : base (...) //if base has required params
{
}
public override void OpenConnection()
{
}
...//Overrides for every other pure virtual method
}
То, что вы пытаетесь реализовать, очень похоже на модель поставщика данных, которая уже реализована в ADO.NET. У вас есть уровень абстракции, доступный в пространстве имен System.Data.Common в виде DbCommand, DbDataAdapter, DbDataReader и т.д. Затем ваш уровень доступа к данным (DAL) может быть записан агентом-агентом данных, что означает, что вы используете фабрики для intantiate фактические типы поставщиков данных, которые реализуют общие/абстрактные классы и/или интерфейсы. В ADO фабрики знают, какой провайдер должен создать экземпляр, используя атрибут dataProvider предоставленной строки подключения. http://www.devx.com/dotnet/Article/27297
Сначала создайте интерфейс для класса. Класс, реализующий интерфейс, гораздо проще заменить, когда на него ссылается этот интерфейс, чем когда он был указан непосредственно в вашем коде. Интерфейсы помогают сделать ваш код более удобным.
Во-вторых, используйте среду инъекций для создания экземпляров вашего класса базы данных.
например, с помощью NInject.. В какой-то момент вашего приложения привяжите интерфейс к желаемой реализации...
Bind<IDatabaseConnection>.To<MySqlConnection>();
создать экземпляр где-нибудь в вашем приложении...
// Creates an instance of the class bound
IDatabaseConnection connection = _kernel.Get<IDatabaseConnection>();