如何在数据访问层获取EcoSystemHomeController类的ConnectionString变量值
实现方案
不建议通过Controller存储连接字符串再向下透传的方式实现,ASP.NET Core 自带依赖注入容器,可以直接将配置注入到数据访问层,耦合度更低,维护更方便,以下是两种常用实现方式:
方案1:直接注入IConfiguration到数据访问层(最简实现)
- 在数据访问层的类构造函数中声明
IConfiguration参数,DI容器会自动传入配置实例:
// 数据访问层示例类 public class CommonDAL { private readonly string _connectionString; public CommonDAL(IConfiguration config) { // 直接在DAL层读取连接字符串,不需要经过业务层、Controller中转 _connectionString = config.GetConnectionString("DefaultConnection"); } // 所有数据库操作方法直接使用 _connectionString 即可 }
- 在 Program.cs(.NET 6+) 或 Startup.cs 中将数据访问层、业务层类注册到DI容器:
// 注册DAL类 builder.Services.AddScoped<CommonDAL>(); // 注册业务层类 builder.Services.AddScoped<EcoBusinessHome>();
- 改造Controller,不要手动new业务层实例,改为通过构造函数注入:
[Route("api/[controller]/[action]")] [ApiController] public class EcoSystemHomeController : ControllerBase { // 由DI容器注入实例,不要手动new private readonly EcoBusinessHome _ebl; private readonly IConfiguration _configuration; public EcoSystemHomeController(IConfiguration config, EcoBusinessHome ebl) { _configuration = config; _ebl = ebl; } [HttpGet] public object GetServiceStatus() { try { string connectionString = _configuration.GetConnectionString("DefaultConnection"); JObject StatusObj = new JObject(); // 注意:你原有代码这里语法有误,JObject.Add需要传键、值两个参数 StatusObj.Add("ConnectionString", connectionString); return StatusObj; } catch { return null; } } }
方案2:封装配置类注入(更规范,适合配置项较多的场景)
如果项目配置项较多,可以单独封装配置类,避免到处注入IConfiguration:
- 新建数据库配置类:
public class DbConnectionConfig { public string DefaultConnection { get; set; } }
- 在 Program.cs 中绑定配置节点并注册:
builder.Services.Configure<DbConnectionConfig>(builder.Configuration.GetSection("ConnectionStrings"));
- 在数据访问层注入配置实例:
public class CommonDAL { private readonly string _connectionString; public CommonDAL(IOptions<DbConnectionConfig> dbConfig) { _connectionString = dbConfig.Value.DefaultConnection; } }
如果确实需要从Controller向下传连接字符串,也可以将ConnectionString作为参数传入业务层方法,再由业务层方法传入数据访问层方法即可,但该方式耦合度高,每次调用都需要传参,不推荐。
内容的提问来源于stack exchange,提问作者Biswa
相关产品推荐
相关产品推荐

