【发布时间】:2015-11-16 16:08:47
【问题描述】:
我有一个静态类,它的唯一工作是通用 SQL 调用的包装器。但是,根据调用静态类的类,我想相应地设置 connectionString(它是包装类中的公共静态字符串)。如果可能的话,我希望它根据使用的上下文推断要使用的连接字符串,而不必传递它。
有没有办法按照我的要求去做?
以这种方式使用静态类是不好的做法吗?
我不太关心有一个只包装 sql 调用的非静态类,维护该对象似乎是额外的工作。
包装器:
public static class SqlServer
{
private static readonly string SqlConnectionString = ConfigurationManager.ConnectionStrings["foo"].ConnectionString;
/// <summary>
/// Single point of entry for SQL queries that need to return a LIST of well-defined objects
/// </summary>
public static IEnumerable<T> ExecuteQuery<T>(SqlConnection sqlConnection, string sql, object param, int? timeout = null)
{
if (sqlConnection != null)
{
return sqlConnection.Query<T>(sql, param, commandTimeout: timeout).ToList();
}
using (var tempSqlConnection = new SqlConnection(SqlConnectionString))
{
tempSqlConnection.Open();
return tempSqlConnection.Query<T>(sql, param, commandTimeout: timeout).ToList();
}
}
}
应该使用“bar”连接字符串:
public class BarController : ApiController
{
[HttpGet]
public int getUserId(string username)
{
var args = new
{
USERNAME = username
};
const string sql = @"SELECT id FROM users WHERE username = @USERNAME";
return SqlServer.ExecuteQuery<int>(null, sql, args).Single();
}
}
应该使用“foo”连接字符串:
public class FooController : ApiController
{
[HttpGet]
public int getUserId(string username)
{
var args = new
{
USERNAME = username
};
const string sql = @"SELECT id FROM users WHERE username = @USERNAME";
return SqlServer.ExecuteQuery<int>(null, sql, args).Single();
}
}
【问题讨论】:
-
显示现有代码。
-
您需要提供有关您正在尝试做什么的更多信息,并显示您关注的代码的特定部分。显然,如果您希望它使用不同的连接字符串,您可以传递一个参数,那么问题是什么?你也可以使用继承——我不知道为什么你的类需要是静态的。
-
“必须维护该对象似乎是额外的工作” - 如果您在很多地方都需要它,那么 那个 就是您的问题。
-
拥有一个带有静态连接字符串的静态类并更改此静态连接字符串会导致并发问题,最终会在错误的数据库上执行错误的查询。我希望你不是要根据调用者来改变比方说 ExecuteReader 方法中的静态连接字符串
-
您可能正在寻找的是Repository pattern。
标签: c#