Я работаю над шаблоном базы данных factory для приложения, которое должно поддерживать Sql Server и Oracle. У меня есть абстрактные классы со всеми запросами Sql для приложения. Я реализовал абстрактный класс в двух классах: SqlServerClass и OracleClass. На основе строки соединения, определенной в файле конфигурации, приложение создает экземпляр соответствующего класса и получает запросы Sql для базы данных.
public abstract class ProviderFactory
{
public abstract string GetCustomersSql();
public abstract string GetCustomersByIdSql();
public abstract string GetUsersSql();
public abstract string GetUsersByIdSql();
}
public class OracleClass : ProviderFactory
{
public override string GetCustomersSql()
{
// return sql query for Oracle
}
// other methods
}
public class SqlServerClass : ProviderFactory
{
public override string GetCustomersSql()
{
// return sql query for Sql Server
}
// other methods
}
Теперь мой вопрос: есть ли способ сгруппировать эти sql-запросы в абстрактном классе, чтобы можно было легко идентифицировать SQL-запросы, используемые для определенных функций. Например, могу ли я объединить все запросы, связанные с клиентами, и запросы, связанные с пользователями, так что, когда я их отправлю, это будет похоже на...
ProviderFactory instance;
// create an instance
instance.Customers.GetCustomersSql();
Являюсь ли я здесь действительным подходом? Пожалуйста, предложите. Спасибо.
Я настоятельно рекомендую использовать ORM, например NHibernate. Он поддерживает как SQL Server, так и Oracle и абстрагирует различия между ними.
Под этим я подразумеваю, что вам нужно только написать запрос один раз в формате, который NHibernate понимает, и он переведет это в версии, которые понимают SQL Server и Oracle.
Если вы хотите продолжить свой текущий путь, то, что вы можете сделать, это создать то, что я бы назвал каталогом запросов:
public interface IQueryDirectory
{
ICustomerQueries Customer { get; }
IUserQueries User { get; }
}
public interface ICustomerQueries
{
string Customers { get; }
string CustomersById { get; }
}
public interface IUserQueries
{
string Users { get; }
string UsersById { get; }
}
Пример реализации:
public abstract class QueryDirectory : IQueryDirectory
{
private ICustomerQueries customer;
private IUserQueries user;
public ICustomerQueries Customer
{
get { return customer; }
}
public IUserQueries User
{
get { return user; }
}
protected QueryDirectory(ICustomerQueries customer, IUserQueries user)
{
this.customer = customer;
this.user = user;
}
}
public class SqlServerQueryDirectory : QueryDirectory
{
public SqlServerQueryDirectory(SqlServerCustomerQueries customer,
SqlServerUserQueries user) : base(customer, user) {}
}
public class SqlServerCustomerQueries : ICustomerQueries
{
public string Customers
{
get "some sql";
}
public string CustomersById
{
get "some sql";
}
}
Затем вы можете реализовать каталоги отдельно для каждой базы данных. Но, честно говоря, я действительно рекомендую использовать ORM вместо этого.