.NET Framework 4.8迁移至.NET 9.0:静态类如何读取连接字符串?
.NET 9迁移中静态DataAccess类获取连接字符串的解决方案
针对.NET Framework迁移到.NET 9后,静态DataAccess类无法通过构造函数注入IConfiguration获取连接字符串的问题,提供以下几种可行方案:
方案1:通过静态初始化方法+DI容器启动时初始化
这是最贴合.NET依赖注入生态的方案,在应用启动时从DI容器中获取IConfiguration,调用静态类的初始化方法完成配置赋值。
修改后的DataAccess类:
namespace MyProject { public static class DataAccess { private static string m_ConnectionString = string.Empty; // 提供静态初始化方法 public static void Initialize(IConfiguration configuration) { m_ConnectionString = configuration.GetConnectionString("DefaultConnStrg"); } // 原有数据库操作方法示例 public static SqlConnection GetOpenConnection() { var conn = new SqlConnection(m_ConnectionString); conn.Open(); return conn; } } }
在Program.cs中调用初始化:
var builder = WebApplication.CreateBuilder(args); // 注册服务... // 初始化静态DataAccess类 DataAccess.Initialize(builder.Configuration); var app = builder.Build(); // 中间件配置... app.Run();
方案2:静态类中手动加载配置文件
如果项目部分模块未使用DI容器,可以直接在静态类中手动加载appsettings.json:
namespace MyProject { public static class DataAccess { private static readonly string m_ConnectionString; // 静态构造函数(仅执行一次) static DataAccess() { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); m_ConnectionString = config.GetConnectionString("DefaultConnStrg"); } // 数据库操作方法... } }
注意:需确保appsettings.json的「复制到输出目录」属性设置为「如果较新则复制」或「始终复制」。
方案3:重构为非静态类(长期推荐)
静态类不利于单元测试和依赖解耦,大型项目长期维护建议逐步重构为可注入的非静态类:
重构后的DataAccess类:
namespace MyProject { public class DataAccess { private readonly string _connectionString; // 通过构造函数注入IConfiguration public DataAccess(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnStrg"); } // 数据库操作方法改为实例方法 public SqlConnection GetOpenConnection() { var conn = new SqlConnection(_connectionString); conn.Open(); return conn; } } }
在Program.cs中注册服务:
builder.Services.AddScoped<DataAccess>();
之后在需要使用DataAccess的地方,通过构造函数注入即可。
内容的提问来源于stack exchange,提问作者Trint
相关产品推荐
相关产品推荐

