You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2 MVC项目中基于Dapper的appsettings.json连接字符串最佳实践

.NET Core 2.x MVC + Dapper 连接字符串配置最佳实践

刚好我之前在.NET Core 2.x项目里用Dapper做过类似配置,完全贴合你想要的方式,下面一步步给你讲清楚:

1. 确认appsettings.json配置格式

你给出的配置完全符合.NET Core的标准规范,不用修改直接用就行:

{
  "ConnectionStrings": {
    "myDatabase": "Server=.;Database=myDatabase;Trusted_Connection=true;"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

.NET Core 2.x的配置系统会自动加载这个文件,不需要额外写加载逻辑(默认在Startup的构造函数里已经初始化好Configuration对象了)。

2. 在Startup.cs中配置依赖注入(关键步骤)

.NET Core 2.x和1.x在依赖注入细节上有调整,这里严格按2.x最佳实践来:
打开Startup.cs,在ConfigureServices方法里,我们把数据库连接注册成Scoped服务(每个请求创建一个实例,用完自动释放,避免连接泄漏):

using System.Data;
using System.Data.SqlClient;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // 注册MVC服务(.NET Core 2.x标准写法)
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        // 读取连接字符串,2.x版本专用的标准方法
        var dbConnectionString = Configuration.GetConnectionString("myDatabase");

        // 注册SqlConnection为Scoped服务,供Dapper直接使用
        services.AddScoped<IDbConnection>(sp => new SqlConnection(dbConnectionString));
    }

    // 其他Configure方法代码...
}

这里用Configuration.GetConnectionString("myDatabase")是2.x版本的标准操作,专门读取ConnectionStrings节点下的配置,比直接索引取值更规范。

3. 在业务/仓储类中使用Dapper

现在你可以在任何需要操作数据库的类里,通过构造函数注入IDbConnection,直接用Dapper写查询:

using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using Dapper;

public class ProductRepository
{
    private readonly IDbConnection _dbConn;

    // 构造函数注入数据库连接
    public ProductRepository(IDbConnection dbConn)
    {
        _dbConn = dbConn;
    }

    // 示例:用Dapper查询数据
    public async Task<List<Product>> GetAllProductsAsync()
    {
        var sql = "SELECT Id, Name, Price FROM Products";
        return (await _dbConn.QueryAsync<Product>(sql)).AsList();
    }
}

如果是在Controller里使用,同样直接注入即可:

using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

public class ProductController : Controller
{
    private readonly ProductRepository _productRepo;

    public ProductController(ProductRepository productRepo)
    {
        _productRepo = productRepo;
    }

    public async Task<IActionResult> Index()
    {
        var products = await _productRepo.GetAllProductsAsync();
        return View(products);
    }
}

补充:特殊场景下的直接读取方式(不推荐)

虽然不建议破坏依赖注入的设计,但如果有特殊需求需要直接读取配置,可以这么做:

using Microsoft.Extensions.Configuration;
using System.IO;

var configBuilder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json");

var configuration = configBuilder.Build();
var connectionString = configuration.GetConnectionString("myDatabase");

不过这种方式在MVC项目里完全没必要,因为Startup已经帮你初始化好Configuration了,直接注入IConfiguration也比自己构建更方便。

关键注意点

  • 确保安装必要的NuGet包:Dapper、System.Data.SqlClient(或Microsoft.Data.SqlClient,两者在2.x中都可用)
  • 注册IDbConnection为Scoped是最佳实践,数据库连接是轻量级对象,每个请求用一个可避免并发问题
  • 始终用配置文件管理连接字符串,不要硬编码,方便不同环境(开发/测试/生产)切换

内容的提问来源于stack exchange,提问作者niico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:09:09