抽象类中的组方法

时间:2009-07-29 15:26:22

标签: c# oop

我正在为应该支持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();

我在这里做的是一种有效的方法吗?请建议。谢谢。

1 个答案:

答案 0 :(得分:3)

我强烈建议使用NHM之类的ORM。它supports both SQL Server and 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。