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

Asp Core中跨项目静态类如何读取appsettings.json配置?

解决方案:跨项目传递配置并优化静态类的配置访问

我来帮你梳理下解决方案,咱们一步步搞定这个问题:

一、先搞定DbContext从appsettings读取连接字符串的问题

你之前在DbContext里硬编码连接字符串的方式不够灵活,咱们改成依赖注入配置的方式,让Web项目的配置能传递到Core项目的DbContext中:

1. 修改DbContext的构造函数

在Core项目的DBContext里新增一个接收DbContextOptions的构造函数,放弃在OnConfiguring里硬编码:

public class DBContext : DbContext
{
    // 通过构造函数注入配置好的DbContextOptions
    public DBContext(DbContextOptions<DBContext> options) : base(options)
    {
    }

    // 可选:保留OnConfiguring做兜底(比如测试场景),但不要硬编码连接字符串
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            // 这里可以写测试用的默认连接,或者抛出异常提醒配置未注入
            // optionsBuilder.UseSqlServer("test-conn-string");
        }
    }

    // 你的DbSet和其他业务代码...
}

2. 在Web项目的Startup里注册DbContext并读取配置

打开Web项目的Startup.cs,在ConfigureServices方法里从appsettings读取连接字符串,注册DbContext:

public void ConfigureServices(IServiceCollection services)
{
    // 从appsettings(含环境配置文件)读取连接字符串
    var connString = Configuration.GetConnectionString("DefaultConnection");

    // 把DbContext注册到DI容器,同时传入配置好的连接字符串
    services.AddDbContext<DBContext>(options =>
        options.UseSqlServer(connString));

    // 其他服务注册(比如MVC控制器等)...
}

对应的appsettings.json结构要匹配:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=你的服务器名;Database=你的库名;Trusted_Connection=True;"
  }
}

这样不管是Debug还是Release环境,都会自动加载对应环境的appsettings.{env}.json里的配置,不用再写#if分支啦。

二、解决静态类访问配置的问题

静态类依赖全局配置其实不太符合.NET Core的依赖注入设计原则,不过分两种情况给你方案:

方案1:改成依赖注入的服务类(更推荐)

把Business静态类改成普通服务类,通过构造函数注入配置和DbContext,这样代码更易测试、更灵活:

// Core项目里的非静态服务类
public class BusinessService
{
    private readonly DBContext _dbContext;
    private readonly IConfiguration _configuration;

    // 构造函数注入需要的依赖
    public BusinessService(DBContext dbContext, IConfiguration configuration)
    {
        _dbContext = dbContext;
        _configuration = configuration;
    }

    public List<你的POCO类> GetAllData()
    {
        // 直接用注入的DbContext
        return _dbContext.GetAllData().ToPOCO().ToList();
        
        // 如果需要读取其他配置,直接用_configuration["配置键"]即可
        // var settingValue = _configuration["AppSettings:SomeKey"];
    }
}

然后在Web项目的Startup里注册这个服务:

services.AddScoped<BusinessService>();
// 生命周期根据你的业务选:Scoped/Transient/Singleton

最后在Controller里注入使用:

public class HomeController : Controller
{
    private readonly BusinessService _businessService;

    public HomeController(BusinessService businessService)
    {
        _businessService = businessService;
    }

    public IActionResult Index()
    {
        var data = _businessService.GetAllData();
        return View(data);
    }
}

方案2:保留静态类,在启动时传递配置

如果一定要保留静态类,就在应用启动时把Configuration实例传递给静态类的静态属性:

// Core项目的静态类
public static class Business
{
    // 静态属性存储配置实例
    public static IConfiguration Configuration { get; set; }

    public static List<你的POCO类> GetAllData()
    {
        // 这里如果需要用配置,直接用Configuration["配置键"]
        // 注意:DbContext最好还是通过DI获取,不要直接new,避免配置不生效
        using (var db = new DBContext(DbContextOptionsHelper.GetOptions()))
        {
            return db.GetAllData().ToPOCO().ToList();
        }
    }
}

然后在Web项目的Startup.cs的Configure方法里赋值:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 把Web项目的Configuration传递给静态类
    Business.Configuration = Configuration;

    // 其他中间件配置...
}

⚠️ 这种方式的缺点是静态类依赖全局状态,不利于单元测试,配置更新后也不会自动感知,所以优先推荐方案1。

三、跨项目依赖的注意事项

  • Web项目要引用Core项目,才能注册Core里的服务和DbContext
  • Core项目要引用Layer项目(因为用到了模型层)
  • Core项目要安装EF Core的相关NuGet包(比如Microsoft.EntityFrameworkCore.SqlServer)

内容的提问来源于stack exchange,提问作者FerX32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:58:20