.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
相关产品推荐
相关产品推荐

