我正在为应该支持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();
我在这里做的是一种有效的方法吗?请建议。谢谢。
答案 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。