通用连接灯泡

本文关键字:连接 | 更新日期: 2023-09-27 18:35:24

我必须为现有应用程序创建一个嵌入式监控,这些应用程序同时使用Entity FrameworkADO。我必须检查连接字符串是否良好,我实际上是这样做的:

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(而不是单个连接),您可以测试连接。