在哪里为我的班级建立公共数据库连接


11

我有几个类(资源库),它们负责在数据库中保存/检索某些对象的任务。它们都需要与一个数据库建立连接。

我认为为了避免在每个类中重新定义ConnectionStringSqlConnection,将开放的连接传递给它们。那么定义/打开该连接并将其传递给类的最佳位置/时间在哪里/何时?

是否有更好的方法/模式可以访问此公共资源?

Answers:


10

将开放的连接传递给每个类可能不是最好的主意。阅读创建数据库连接-是一次还是每个查询一次?

建议您为每个要运行的查询打开和关闭连接,而不是将打开的连接传递到存储库。

您可以尝试使用这种方法来帮助您管理连接。

public class Repository
{
    private readonly string _connectionString;

    public Repository()
    {
        _connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
    }

    protected SqlConnection GetConnection()
    {
         return new SqlConnection(_connectionString);
    }


}

public sealed class UserRespository : Repository
{

    public User GetUsers()
    {
        using (var connection = GetConnection())
        {
            using (var commnad = new SqlCommand("SqlQuery", connection))
            {
                //Execute Query
                //Return results
            }
        }
    }
}

5

具有开放的连接并在类之间传递它通常是一个坏主意。当然,打开连接确实会对性能造成影响,但是连接池已经通过重用已经打开的连接来解决此问题。不过请注意:始终等待尽可能长的时间来调用connection.Open(),尤其是在多线程代码中,因为这会将连接分配给您的方法(这将有目的地增加对数据库的打开连接所需的数量)。

为了使您的类尽可能通用,我建议您使用一个基类,使用IDbConnection公开一个方法,并且您的存储库将具有更通用的实现。

internal abstract class Repository
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;

    protected IDbConnection GetConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

public class MyRepository : Repository
{
    public IEnumerable<object> Get()
    {
        using (var connection = GetConnection())
        {
            connection.Open();

            ...
        }
    } 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.