我们的生产服务器终止了不活动的连接,所以我们的API需要在需要时恢复它们。以下代码有效,但它非常重复:如何重新使用重新打开连接的代码?
private const int MaxRetryCount = 3;
public static SqlDataReader RestoreConnectionAndExecuteReader(SqlCommand command)
{
int retryCount = 0;
while (retryCount++ < MaxRetryCount)
{
try
{
if (command.Connection.State == ConnectionState.Closed)
command.Connection.Open();
return command.ExecuteReader();
}
catch(Exception e)
{
if(!e.Message.ToLower().Contains("transport-level error has occurred"))
{
throw;
}
}
}
throw new Exception("Failed to restore connection for command:"+command.CommandText);
}
public static void RestoreConnectionAndExecuteNonQuery(SqlCommand command)
{
var retryCount = 0;
while(retryCount++ < MaxRetryCount)
{
try
{
if (command.Connection.State == ConnectionState.Closed)
command.Connection.Open();
command.ExecuteNonQuery();
return;
}
catch(Exception e)
{
if (!e.Message.ToLower().Contains("transport-level error has occurred"))
{
throw;
}
}
}
throw new Exception("Failed to restore connection for command:" + command.CommandText);
}
我该如何重构我的代码并消除重复?我需要保留这些方法的签名,因为它们在整个系统中都被使用。
您是否想过将方法提取到接口..?也没有重复所以说一个方法是无效的,而另一个返回一个SQLReader,你可能通过使用一种方法并使用参数只是一个建议,可以消除这一点 – MethodMan 2012-02-02 21:59:35
@DJKRAZE:是的,我做到了。但是,第一个方法返回SqlDataReader,而第二个方法是void。 – 2012-02-02 22:01:40
你可以将重复的逻辑分成另一种方法,你可以从你现有的所有方法中调用并返回一个bool或SqlCommand对象本身(重新连接)然后在其上运行你的操作... NonQuery,ExecuteReader等 – 2012-02-02 22:03:12