【发布时间】:2011-02-24 23:19:44
【问题描述】:
我正在设计一个将由数百个客户端调用的 WCF 服务,并且我有一个关于将由数据库查询运行的类的最佳体系结构的问题。今天我只访问 SQL Server,所以我有一个内部调用的静态类来完成创建连接和数据读取器的所有脏活。下面是一个简单的例子:
namespace DBHelper.Utility
{
public static class SqlDBManager
{
public static void RunSql(String pSql, DBParamsHelper pDBParams, String pConnStringConfigName)
{
String sConnectionString = GetConnectionStringFromConfig(pConnStringConfigName);
SqlConnection oConn = new SqlConnectionsConnectionString
oConn.Open();
try
{
SqlCommand oCommand = new SqlCommand(pSql, oConn);
oCommand.CommandTimeout = 0;
if (pDBManagerParams != null)
{
foreach (SqlParameter sqlParam in pDBManagerParams)
{
oCommand.Parameters.Add(sqlParam);
}
}
oCommand.ExecuteNonQuery();
}
finally
{
oConn.Close();
}
}
}
}
现在,我需要添加对同时运行 Sql Server 和 Oracle 的支持。我最初的想法是声明一个接口,并让我现有的SqlDBManager 实现它,然后开发一个实现相同接口的OracleDBManager。问题是我的类是静态的,静态类不能实现接口。我希望我的助手类保持静态,因为它更实用,而且我不必每次需要运行查询时都创建一个新对象。我也想过使用类继承,但是我不能有statis虚方法,所以用处不大。我考虑了一些单例实现,所以我不必创建类,但是我在多线程访问时会遇到麻烦。
什么是最好的设计模式,这样我就可以在多线程场景中获得出色的性能(非常重要),无需过多的工作编码以提高生产力(不必创建很多类),并为OracleDBManager 提供标准方法和SqlDBManager 课程?标准方法很重要,因为我不想让使用这些帮助类的代码知道它们是连接到 Oracle 还是 Sql Server。
我确实考虑过使用 ORM 解决方案,例如 Entity Framework 4 和 nHibernate,但是对性能的影响太大了。由于我将运行简单查询,因此 PL-SQL 和 TSQL 之间的查询语法差异并不重要。
任何输入和想法将不胜感激。提示
【问题讨论】:
标签: c# design-patterns