我有一个静态类,其唯一的工作是通用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();
}
}
}
应该使用&#34; bar&#34; ConnectionString的:
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();
}
}
应该使用&#34; foo&#34; ConnectionString的:
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();
}
}
答案 0 :(得分:1)
有没有办法做我要问的事情? 以这种方式使用静态类是不好的做法吗?
总有办法,但除非你了解后果,否则不应该做一些事情。这是不应该做的事情之一。强制静态类的行为就像一个可变对象几乎没有任何理由。所以,是的,这是不好的做法。
静态类包装的SQL方法需要连接。该类可以使用从调用者传入的参数提供与这些SQL方法的连接,这是您现在正在做的(可接受的做法)。或者类可以包含提供连接本身,这意味着它将它存储为属性,并在调用SQL方法时使用它。
使用静态类意味着您希望连接字符串在初始化后保持不变;它不会在进程的生命周期内发生更改,除非您公开一个方法(公共属性)来更改它,这使您容易受到并发问题的影响。通过根据调用者进行更改,您可以使其不变。
您要做的是让静态类从调用者中提取连接的值。这违反了OOP的封装原则。
更好的做法是做你认为“额外工作”的事情。让每个调用者实例化此包装类的对象,在构造函数参数中提供连接字符串。
答案 1 :(得分:-2)
您可以将对象传递给正在调用的静态方法,然后打开此对象的类型以设置连接字符串。
e.g。
public static ConnectToDb(object _Object)
{
switch(typeof(_Object))
{
//Set connection string...
}
// Do some stuff
}
通过ConnectToDb(this)...或其他东西
调用