Групповые методы в абстрактном классе - PullRequest
2 голосов
/ 29 июля 2009

Я работаю над шаблоном фабрики баз данных для приложения, которое должно поддерживать Sql Server и Oracle. У меня есть абстрактные классы со всеми Sql Queries для приложения. Я реализовал абстрактный класс в двух классах: 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();

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

1 Ответ

3 голосов
/ 29 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...