如何在自定义类读取appsettings.json连接字符串并修复SqlConnection异常
问题解答
一、在自定义类MyConnection中读取MyString连接字符串
步骤1:定义配置绑定类
创建与appsettings.json中配置对应的实体类,确保属性名匹配配置项:
public class MyConnection { public string MyString { get; set; } }
步骤2:在Program.cs中配置绑定与服务注册
在.NET 6+的启动文件中,完成配置绑定并将类注册为依赖注入服务:
var builder = WebApplication.CreateBuilder(args); // 绑定appsettings中的MyString配置到MyConnection类 // 如果MyString嵌套在ConnectionStrings节点下,使用GetSection("ConnectionStrings:MyString") builder.Services.Configure<MyConnection>(builder.Configuration.GetSection("MyString")); // 注册MyConnection为可直接注入的单例服务(可选,也可直接注入IOptions<MyConnection>) builder.Services.AddSingleton<MyConnection>(sp => sp.GetRequiredService<IOptions<MyConnection>>().Value);
步骤3:在自定义类中注入读取连接字符串
通过构造函数注入配置实例,直接读取连接字符串:
public class MyConnection { private readonly string _connectionString; // 方式1:注入IOptions<MyConnection> public MyConnection(IOptions<MyConnection> options) { _connectionString = options.Value.MyString; } // 方式2:直接注入绑定后的实例(需先完成步骤2的Singleton注册) // public MyConnection(MyConnection connectionConfig) // { // _connectionString = connectionConfig.MyString; // } // 提供获取数据库连接的方法 public SqlConnection GetDbConnection() { return new SqlConnection(_connectionString); } }
二、修复控制器中SqlConnection的异常
你的控制器代码存在3个核心问题,修改方案如下:
- 原构造函数未给私有字段
_sqlConnection赋值,导致字段始终为null; .NET Core/.NET 5+环境下不推荐使用System.Configuration.ConfigurationManager,应通过依赖注入获取配置;- 字段初始化阶段配置尚未加载,直接创建
SqlConnection会触发空引用异常,需移至方法内按需创建。
修改后的控制器代码
public class CRUDController : ControllerBase { private readonly MyConnection _myConnection; private readonly ILogger<CRUDController> _logger; // 通过依赖注入获取MyConnection实例 public CRUDController(ILogger<CRUDController> logger, MyConnection myConnection) { _logger = logger; _myConnection = myConnection; } // 在业务方法内按需创建SqlConnection,并用using自动释放资源 [HttpGet] public IActionResult ExampleAction() { using (SqlConnection con = _myConnection.GetDbConnection()) { con.Open(); // 执行数据库操作逻辑 } return Ok(); } // SearchRequest按需初始化,若需复用可改为方法内创建或注入 SearchRequest sr = new SearchRequest(); }
补充:确保appsettings.json配置格式正确
示例配置(根据实际结构调整):
{ "MyString": "Server=你的服务器地址;Database=数据库名;Uid=用户名;Pwd=密码;" // 若使用ConnectionStrings节点: // "ConnectionStrings": { // "MyString": "Server=你的服务器地址;Database=数据库名;Uid=用户名;Pwd=密码;" // } }
内容的提问来源于stack exchange,提问作者Dishak
相关产品推荐
相关产品推荐

