Групповые методы в абстрактном классе

2

Я работаю над шаблоном базы данных 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();

Являюсь ли я здесь действительным подходом? Пожалуйста, предложите. Спасибо.

Теги:
oop

1 ответ

3
Лучший ответ

Я настоятельно рекомендую использовать 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 вместо этого.

  • 0
    Привет Гарри, спасибо за ответ. Мне нравится подход ORM, но я использую некоторые сложные запросы, такие как рекурсивные запросы, общие выражения таблиц и т. Д. Могу ли я по-прежнему использовать NHibernate для поддержки этих запросов? Кроме того, в оригинальном подходе, как я могу реализовать методы интерфейса в классах OracleClass и SqlServerClass? Большое спасибо.
  • 0
    Возможно, вы не сможете использовать NHibernate для действительно сложных запросов, но он определенно способен выполнять 95% запросов в обычном проекте. Делая эти 95% простыми в обслуживании между базами данных, вам не о чем беспокоиться. NHibernate по-прежнему позволяет вам совершать прямые вызовы в базу данных, когда это необходимо, чтобы вы могли использовать подход для каждой базы данных в более сложных областях, в то же время получая преимущества от реализации через несколько баз данных везде.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню