你会如何重构这段代码?

Evg*_*eny 1 c# refactoring compact-framework

这段代码在Windows Compact Framework上运行,它的作用是显而易见的.看起来它应该被重构(特别是考虑到我可能想稍后添加cmd.ExecuteResultSet()),但我看不到一种优雅的方式来做到这一点.任何想法都赞赏.

internal void RunNonQuery(string query)
{
    string connString = GetLocalConnectionString();

    using (SqlCeConnection cn = new SqlCeConnection(connString))
    {
        cn.Open();
        SqlCeCommand cmd = cn.CreateCommand();
        cmd.CommandText = query;
        cmd.ExecuteNonQuery();
    }
}  

internal int RunScalar(string query)  
{
    string connString = GetLocalConnectionString();

    using (SqlCeConnection cn = new SqlCeConnection(connString))
    {
        cn.Open();
        SqlCeCommand cmd = cn.CreateCommand();
        cmd.CommandText = query;
        return int.Parse(cmd.ExecuteScalar().ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

我不确定我重构它,但也许:

static void PerformQuery(string connectionString, string command,
      Action<SqlCeCommand> action)
{ //TODO: sanity checks...
    using(SqlCeConnection conn = new SqlCeConnection(connectionString))
    using(SqlCeCommand cmd = conn.CreateCommand()) {
        cmd.CommandText = command;
        conn.Open();
        action(cmd);
    }
}

internal void RunNonQuery(string query)
{
    string connString = GetLocalConnectionString();
    PerformQuery(connString, query, cmd => cmd.ExecuteNonQuery());
}  

internal int RunScalar(string query)  
{
    int result = 0;
    string connString = GetLocalConnectionString();
    PerformQuery(connString, query,
        cmd => {result = int.Parse(cmd.ExecuteScalar().ToString()); }
    );
    return result;
}
Run Code Online (Sandbox Code Playgroud)

否则 - 只是一个CreateAndOpenConnection(string)方法和一个CreateCommand(SqlCeConnection,string)方法.