ASP.NET Core中如何为控制器提供连接字符串(避免直接注入IConfiguration)
解决方案:用选项模式为控制器提供连接字符串
针对你遇到的问题,推荐使用ASP.NET Core官方推荐的选项模式来管理连接字符串,既避免直接注入IConfiguration,又能优雅实现配置的依赖注入。
步骤1:定义强类型配置类
创建一个强类型类来封装数据库配置,替代原有的DBUtils:
public class DbSettings { public string DBConnectionString { get; set; } }
步骤2:在Startup中配置并注册服务
在ConfigureServices方法中绑定配置,并将配置类注册到依赖注入容器:
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { // 绑定appsettings中的配置到DbSettings services.Configure<DbSettings>(Configuration.GetSection("DbSettings")); // 可选:注册DbSettings为单例,方便直接注入(而非IOptions<DbSettings>) services.AddSingleton(provider => provider.GetRequiredService<IOptions<DbSettings>>().Value); services.AddControllers(); } }
步骤3:在appsettings.json中添加配置节点
确保配置文件中包含对应的连接字符串节点:
{ "DbSettings": { "DBConnectionString": "你的数据库连接字符串内容" } }
步骤4:在控制器中注入使用
直接在控制器构造函数中注入DbSettings或IOptions<DbSettings>:
public class CommonController : ControllerBase { private readonly string _conStr; // 方式1:直接注入DbSettings单例 public CommonController(DbSettings dbSettings) { _conStr = dbSettings.DBConnectionString; } // 方式2:官方推荐的IOptions注入(支持配置重载) // public CommonController(IOptions<DbSettings> dbSettings) // { // _conStr = dbSettings.Value.DBConnectionString; // } public IActionResult GetData() { // 使用using确保数据库连接自动释放 using (SqlConnection connection = new SqlConnection(_conStr)) { connection.Open(); // 执行数据库查询等操作 return Ok(); } } }
补充:如果坚持使用原DBUtils类
若想保留原DBUtils,可以在注册单例时手动传入连接字符串:
services.AddSingleton<DBUtils>(new DBUtils(Configuration.GetConnectionString("DefaultConnection")));
但这种方式灵活性不足,选项模式仍是更规范的解决方案。
内容的提问来源于stack exchange,提问作者MSBI-Geek
相关产品推荐
相关产品推荐

