【问题标题】:How to create IDbConnection factory using Autofac for Dapper?如何使用 Autofac for Dapper 创建 IDbConnection 工厂?
【发布时间】:2021-09-15 05:16:18
【问题描述】:

在我的项目中,我使用的是 Autofac 和 Dapper,到目前为止,我一直在以这种方式注册所需的 IDbConnection

builder
    .Register<IDbConnection>(c => new SqlConnection(_connectionString))
    .InstancePerLifetimeScope();

但现在我面临的问题是,通过该实现我无法对数据库进行并行操作。

解决方案是创建一个我想的工厂。但我找不到任何信息如何使用 Autofac 来实现。

【问题讨论】:

  • 您是否查看过 Autofac 的实例范围信息?我不确定您的情况,但您是否考虑过使用范围InstancePerDependencyAutofac - Instance Scope。该文档指出,“在其他容器中也称为‘瞬态’或‘工厂’。使用每个依赖范围,每个服务请求都会返回一个唯一的实例。”.
  • 我认为这行不通。假设您在MyDapperService 中注入IDbConnection。然后你在MyQueryClass 中注入你的MyDapperService,如果你多次调用MyDapperService.CallDatabaseMethod,它仍然是同一个实例,因为你已经在MyQueryClass 中注入了一次。

标签: c# .net-core autofac dapper


【解决方案1】:

这是我解决这个问题的方法。如果您发现可以改进的地方,请告诉我。

builder.Register(ctx => new DbConnectionFactory(_connectionString))
    .Named<DbConnectionFactory>(nameof(DbConnectionFactory))
    .InstancePerDependency();

builder.Register<Func<DbConnectionFactory>>(c =>
{
    var cc = c.Resolve<IComponentContext>();
    return () => cc.ResolveNamed<DbConnectionFactory>(nameof(DbConnectionFactory));
});

工厂:

public class DbConnectionFactory
{
    private readonly string _connectionString;

    public DbConnectionFactory(string connectionString)
    {
        _connectionString = connectionString;
    }

    public IDbConnection Connection => new SqlConnection(_connectionString);
}

通过注入Func&lt;DbConnectionFactory&gt; dbConnectionFactory 和调用在任何类中使用:

using (var connection = _dbConnectionFactory().Connection)
{
    var result = await connection.QueryAsync<T>(Query, Parameters);
    return result.ToList();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多