C# 创建用于创建新SqlConnection对象的工厂方法

C# 创建用于创建新SqlConnection对象的工厂方法,c#,sql-server,C#,Sql Server,我现在在代码中重复了几次类似的内容: using (var conn = CreateConnection()) using (var dataCommand = conn.CreateCommand()) { conn.Open(); [...] } 对于工厂方法CreateConnection(),以下是否正确?还是会容易出错?(注意:我只打算使用指令从调用它) 或者,是否有必要修改此方法并在其中打开呢?您

我现在在代码中重复了几次类似的内容:

using (var conn = CreateConnection())
using (var dataCommand = conn.CreateCommand()) 
{
        conn.Open();
        [...]                        
} 
对于工厂方法
CreateConnection()
,以下是否正确?还是会容易出错?(注意:我只打算使用指令从
调用它)


或者,是否有必要修改此方法并在其中打开
呢?

您的代码就是静态工厂方法的典型示例

工厂模式是的一部分,它是软件设计中给定上下文中常见问题的通用可重用解决方案。我可以建议您阅读这本书,这是理解设计模式的一本非常好的入门书

关于代码的几点建议:

  • 将工厂方法设为静态,它不使用任何实例变量等
  • 不相关,但是,您不需要在工厂方法中使用局部变量,您可以直接返回连接
  • 现在,您的方法如下所示:

    static SqlConnection CreateConnection(){
        return new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
    }
    
    在调用SqlConnection的构造函数之前,您可能需要检查ConnectionString[“IMS”]是否为null。此类中不需要进一步的错误处理,因为它不会启动连接

    假设您希望返回打开的连接,并用相同的方法处理连接错误:

    static SqlConnection CreateConnection()
    {
    
        if (ConfigurationManager.ConnectionStrings["IMS"] == null)
        {
            throw new Exception("Connection string not found in the configuration file.");
        }
        var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
        try
        {
            sqlConnection.Open();
        }
        catch (Exception exception)
        {
            throw new Exception("An error occured while connecting to the database. See innerException for details.", exception);
        }
        return sqlConnection;
    }
    

    如果需要,您可以创建自己的异常类,以便稍后处理这些异常。看见如果发生异常,也可以返回null,但请先选中“”。

    工厂和单例:

    我的咆哮。欢迎

    在功能上,我看到了开发人员理解工厂模式的方式上的脱节。简而言之 从某种意义上讲,工厂会也应该提供产品。(例如:如果你有一个“汽车工厂”,它应该给你一辆“汽车”)

    话虽如此,您只在不希望实例化逻辑被公开时才实现工厂模式 而且需要创造不同的混凝土产品。在你的情况下,如果你需要 始终是SQL对象(一种产品),然后为什么是工厂? 您可以争论可扩展性和可伸缩性,但这是主观的。大多数公司都是这样生活的 SQL server或Oracle已过时,您将不会使用产品中内置的可扩展性

  • 我相信,您可以很好地使用带有静态成员的(或)更简单的类
  • 另一个重要的方法是CloseConnection()方法。 在原始代码中,您使用了
    using
    ,它杀死并处置对象,但在新代码中 静态实现,您可能需要构建它
    您好,您为什么希望避免服务中的冗余代码?我希望避免重复这一行
    SqlConnection conn=new SqlConnection(ConfigurationManager.ConnectionStrings[“IMS”].ConnectionString)
    在我的代码中的很多地方,我在我的博客+1中提交了基于模板方法的解决方案以获取帮助:是否可以在此statuc方法中检查ConnectionString[“IMS”]是否为null?这些静态工厂方法还包括哪些与服务器联系的其他方法?例如,您可以返回打开的连接,在这种情况下,您可以检查连接是否已建立(并处理连接错误)您可以在回答中添加一个示例,我会用什么语法来实现这一点?
    static SqlConnection CreateConnection()
    {
    
        if (ConfigurationManager.ConnectionStrings["IMS"] == null)
        {
            throw new Exception("Connection string not found in the configuration file.");
        }
        var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
        try
        {
            sqlConnection.Open();
        }
        catch (Exception exception)
        {
            throw new Exception("An error occured while connecting to the database. See innerException for details.", exception);
        }
        return sqlConnection;
    }
    
        public static void CloseConnection(SQLConnection conn)
        {
            if (conn.State == ConnectionState.Open)
            {
               conn.Close();
               conn.Dispose();
            }
        }