gpt4 book ai didi

c# - 注入(inject) IDbConnection 与 IDbConnectionFactory

转载 作者:太空狗 更新时间:2023-10-30 01:28:53 29 4
gpt4 key购买 nike

TLDR:注入(inject)连接工厂与 IDbConnection 本身的原因是什么。

我目前在 .net MVC 中使用 Autofac 将 IDbConnection 实例注入(inject)到我的存储库类中,以便与 Dapper 一起使用,如下所示:

Autofac 设置:

builder.Register<IDbConnection>(ctx => new
SqlConnection(conSettings.ConnectionString)).InstancePerRequest();

repo :

public ClientRepository(IDbConnection connection)
{
_connection = connection;
}

public async Task<IEnumerable<Client>> GetAsync()
{
string query = "SELECT * FROM Clients";
return (await _connection.QueryAsync<Client>(query)).ToList();
}

到目前为止,这对我来说一直工作得很好,但我有点担心连接保持打开状态而不被丢弃。

我找到的每篇关于该主题的帖子都以有人建议传入连接工厂并在 using 语句中调用它而告终,而没有真正提及为什么我当前的设置“不好”。

据我所知,每个请求都应该有自己的 IDbConnection,其中 Dapper 负责打开和关闭连接,而 Autofac 负责处理。

不是这样的吗?我错过了什么吗?

最佳答案

我在 ASP.NET Core 项目上执行此操作的方式(请稍等片刻,我知道这不是您使用的,但概念仍然适用)是通过存储库构造函数注入(inject)连接字符串。

如您所见,我实际上注入(inject)了 IConfiguration 对象,因为由于其他要求,我需要配置文件中的其他设置。假装它是连接字符串。

然后我的存储库看起来像这样(粗略的例子,从我的头顶写下来所以请原谅我可能犯的任何错误):

public class FooRepository
{
private readonly IConfiguration _configuration;

public FooRepository(IConfiguration configuration)
{
_configuration = configuration
}

private IDbConnection Connection => new SqlConnection(_configuration.GetConnectionString("myConnectionString"));

public Foo GetById(int id)
{
using (var connection = Connection)
{
return connection.QueryFirstOrDefault<Foo>("select * from ...", new {id});
}
}
}

ADO.NET 连接被合并,根据需要打开一个然后关闭它是通常的方式。通过使用 using,您可以确保连接在您完成后立即关闭并处理 - 返回到池中,即使抛出异常也是如此。

当然你可能想把这个公共(public)代码提取到一个抽象父类(super class)中,这样你就不需要在每个存储库中重复连接字符串的名称,也不需要重新实现 Connection属性(property)。

此外,正如我在评论中提到的,Dapper 不负责打开或关闭连接,事实上,它完全希望在您调用其任何方法之前打开连接。 < strong>这不再是真的,抱歉。

关于c# - 注入(inject) IDbConnection 与 IDbConnectionFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55690339/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com