根据被称为

时间:2015-11-16 16:08:47

标签: c#

我有一个静态类,其唯一的工作是通用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();
    }
}

2 个答案:

答案 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)...或其他东西

调用