通用连接灯泡
本文关键字:连接 | 更新日期: 2023-09-27 18:35:24
我必须为现有应用程序创建一个嵌入式监控,这些应用程序同时使用Entity Framework
和ADO
。我必须检查连接字符串是否良好,我实际上是这样做的:
if (c.ConnectionString.Contains("metadata"))
{
using (var connection = new EntityConnection(c.ConnectionString))
{
try
{
connection.Open();
isWorking = true;
connection.Close();
}
catch (EntityException)
{
// Le catch n'a pas de raison d'être, la variable étant à false par défaut
}
}
}
else
{
using (var connection = new SqlConnection(c.ConnectionString))
{
try
{
connection.Open();
isWorking = true;
connection.Close();
}
catch (SqlException)
{
// Le catch n'a pas de raison d'être, la variable étant à false par défaut
}
}
}
但我有很多冗余。我怎样才能开发这个东西,只得到一次尝试捕获,而不是一次Entity
一次SQL
?
connections strings
实际上是用System.Configuration.ConfigurationManager.ConnectionStrings
检索
谢谢。
EntityConnection 和 SqlConnection 都继承自 DbConnection 作为其共同祖先,因此您可以编写一个函数,该函数仅采用 DbConnection 的一个实例,而其余代码几乎保持不变。
public bool CheckConnection(DbConnection connection)
{
try
{
connection.Open();
connection.Close();
return true;
}
catch (Exception)
{
// Le catch n'a pas de raison d'être, la variable étant à false par défaut.
}
return false;
}
然后,您可以使用相同的逻辑调用代码:
if (c.ConnectionString.Contains("metadata"))
{
using (var connection = new EntityConnection(c.ConnectionString))
{
isWorking = CheckConnection(connection);
}
}
else
{
using (var connection = new SqlConnection(c.ConnectionString))
{
isWorking = CheckConnection(connection);
}
}
这只是使用已有内容的简单重构,而无需更改代码的逻辑。
如果您不想捕获泛型异常(在我看来在这种情况下完全没问题),C# 6 提供了一个新构造,允许更通用地捕获某些异常:
catch (Exception ex) when (ex is EntityException || ex is SqlException)
{
// exception handling code
}
此外,如果 if ... else
语句中没有其他逻辑,则可以使用单个 using 块:
if (c.ConnectionString.Contains("metadata"))
{
connection = new EntityConnection(c.ConnectionString);
}
else
{
connection = new SqlConnection(c.ConnectionString);
}
using (connection)
{
// same as before.
}
下一个合乎逻辑的步骤是创建某种工厂类/方法来提取和创建不同的连接。
由于两者都是从 DbConnection
派生的,你可以这样做:
using(DbConnection connection = c.ConnectionString.Contains("metadata") ?
new EntityConnection(c.ConnectionString) as DbConnection: new SqlConnection(c.ConnectionString) as DbConnection)
{
try
{
connection.Open();
isWorking = true;
connection.Close();
}
catch (Exception e) //make this more generic
{
//Do something
}
}
通过使用DbConnection
(而不是单个连接),您可以测试连接。