You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:18:17