C# 是否应将同一连接注入多个存储库,还是在每个调用的方法中打开一个新连接?

C# 是否应将同一连接注入多个存储库,还是在每个调用的方法中打开一个新连接?,c#,asp.net,ado.net,C#,Asp.net,Ado.net,我有一个视图,需要从系统中的多个存储库中填充信息 var employee = employeeRepository.GetEmployeeById(20); var notes = notesRepository.GetNotes(); 我正在使用ADO.NET进行数据访问。每个存储库是否应该将连接作为参数 using(var connection = dbFactory.GetConnection()) { var employeeRepository = new Empl

我有一个视图,需要从系统中的多个存储库中填充信息

var employee = employeeRepository.GetEmployeeById(20);
var notes = notesRepository.GetNotes();
我正在使用ADO.NET进行数据访问。每个存储库是否应该将连接作为参数

using(var connection = dbFactory.GetConnection())
{    
    var employeeRepository = new EmployeeRepository(connection);
    var notesRepository = new NotesRepository(connection);
}
或者,每个Get方法是否应该打开和关闭方法内的连接?我已经对执行进行了计时,使用一个传递的连接速度更快。一吨也没有。我现在更关心的是正确的方法

另外,保持打开和关闭连接对数据库有什么影响?

ADO.NET使用a来提高性能(对于SQL server是这样,请使用数据库提供程序文档检查它是否支持连接池)。因此,在创建新的SqlConnection时,实际上并没有打开到数据库的物理连接。您只是从连接池中绘制一个现有连接。在现有连接上调用.Dispose时,实际上并没有关闭与数据库的物理连接。您只需将此连接返回到连接池,以便可以重用它

因此,您可以在每次向数据库发送查询时安全地编写以下代码:

using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCOmmand())
{
    // no, you are not opening a real connection here, you are just drawing one from the pool
    conn.Open();
    cmd.CommandText = "SELECT ....";
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // ...
        }
    }
} // No, you are not closing the connection here, you are simply returning it to the pool
因此,基本上,如果ADO.NET提供程序支持连接池(通常所有受尊重的提供程序都应该支持连接池),则不需要存储对SQL连接的任何引用。只需调用构造函数并传递连接字符串。因此,您只需要连接字符串


备注:连接池是根据AppDomain和每个连接字符串进行的。这意味着,如果有两个不同的连接字符串连接到同一个数据库,并且将这两个连接字符串传递给不同的SQL连接实例,则每个连接字符串(即2个池)将获得一个连接池。

这是独立于数据库的吗?我们正在使用SQLBase(不是出于选择),它刚刚发布了完全管理的.NET数据提供程序。池仍然存在?我不知道什么是SQLBase。您应该阅读他们的文档,以及您使用的ADO.NET提供程序是否支持连接池。@DarinDimitrov如果我需要不同存储库的不同方法在同一事务中执行该怎么办?我应该将事务对象
Conexion.BeginTransaction(IsolationLevel.ReadCommitted)
注入这些存储库吗?我认为一种常见的方法是为每个工作单元创建一个连接。如果一个操作需要多个DB调用,它们将共享连接。如果一个工作单元只需要一个DB调用,那么您将为该调用使用一个连接。谷歌
工作单元模式
并查看前两个链接。