如何在应用程序顶部一次性设置 Dapper 连接字符串?

问题描述 投票:0回答:1

我在 ASP.NET Core 7 Web API 中使用 Dapper。

我有很多类似这样的功能:

public async Task<int> InsertTableObject(TableObject tableObject)
{
    using var connection = new SqlConnection(Configuration.GetConnectionString("MyDB"));
    var result = await connection.ExecuteAsync(
        "INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)",
        tableObject);
    return result;
}

每次打开新连接并传递连接字符串时:

Configuration.GetConnectionString("MyDB")

我想知道是否可以在

program.cs
中执行一次并在这些功能中使用连接?我不是故意那样做的:

private readonly IConfiguration _configuration;

public YourRepositoryClass(IConfiguration configuration)
{
    _configuration = configuration;
}

private SqlConnection GetOpenConnection()
{
    var connection = new SqlConnection(_configuration.GetConnectionString("MyDB"));
    connection.Open();
    return connection;
}

因为它只是包装 Dapper 连接(相反,我想配置为使用“MyDB”连接字符串),并且每次使用 Dapper SQL 类时,它都会从配置中读取。

可以这样做吗?比如:

// program.cs
...
Dapper.setConnectionString(Configuration["MyDB"]);
...
var app = builder.Build();
...

// foo.cs:
class Foo {
  public async Task<int> InsertTableObject(TableObject tableObject)
    {
        using var connection = new SqlConnection(); // or without new? Dapper.Connection?
        var result = await connection.ExecuteAsync(
            "INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)",
            tableObject);
        return result;
    }
}
c# asp.net-core-webapi dapper .net-7.0
1个回答
1
投票

你可以围绕 Dapper 创建包装器,如下所示:

using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using Dapper;

namespace MyApp.Services
{
    public interface IDbService
    {
        Task<int> ExecuteAsync(string query, object parameters);
    }


    public class DbService : IDbService
    {
        private readonly IConfiguration _configuration;

        public DbService(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        private SqlConnection GetSqlConnection()
        {
            var connection = new SqlConnection(_configuration.GetConnectionString("MyDB"));
            return connection;
        }

        public async Task<int> ExecuteAsync(string query, object parameters)
        {
            await using var connection = GetSqlConnection();
            return await connection.ExecuteAsync(query, parameters).ConfigureAwait(false);
        }
    }
}

在DI注册:

builder.Services.AddScoped<IDbService,DbService>();

并按如下方式使用:

 public class Foo
 {
     private readonly IDbService _dbService;

     public Foo(IDbService dbService)
     {
         _dbService = dbService;
     }

     public async Task<int> InsertTableObject(TableObject tableObject)
     {         
          return _dbService.ExecuteAsync(@"INSERT INTO [table_object] (name, create_at) 
                                              VALUES (@Name, @CreateAt)", tableObject);
     }
 }

© www.soinside.com 2019 - 2024. All rights reserved.