- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
TLDR:注入(inject)连接工厂与 IDbConnection 本身的原因是什么。 我目前在 .net MVC 中使用 Autofac 将 IDbConnection 实例注入(inject)到
使用 ServiceStack 创建服务的速度给我留下了深刻的印象,但有一段时间我无法掌握在我的项目中同时使用 OrmLite 和 Dapper 的概念。我正在 Global.asax.cs 中注册这
如何设置 IDbConnectionFactory 在不继承 Service 时 Autowiring /注入(inject)? 我将在另一个存储库类中使用一些存储库类,但不从服务类继承。它看起来像这
我想使用 servicestack.ormlite 连接到数据库。但即使在添加了 Nuget 的引用后,我也会收到此错误。 我是用这个命令安装的 Install-Package ServiceStac
您将如何在 Funq 中注册不同的 IDbConnectionFactory 实例,然后直接在您的服务中访问它们?命名实例是否以某种方式在这里发挥作用? 这是跨服务使用不同数据库时采用的最佳方法吗?
我是一名优秀的程序员,十分优秀!