访问静态类上的配置/设置 - Asp Core

Fer*_*X32 11 c# asp.net-core-mvc .net-core asp.net-core

我有3个解决方案.Project.Web,Project.Core(Business)和Project.Layer(Models).

在Project.Core中,我有一个静态文件,我可以Business.GetAllData();从Project.Web.Controller中调用它.

这会调用DAL/EF文件并获取data(BusinessDal.GetData()).

        using (DBContext db = new DBContext())
        {
            return db.GetAllData().ToPOCO();
        }
Run Code Online (Sandbox Code Playgroud)

在我的配置/ DbContext.cs上,我有这个:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    #if DEBUG
        optionsBuilder.UseSqlServer(@"connstring");
    #else
        optionsBuilder.UseSqlServer(@"connstring");
    #endif
    // How do I access configuration here? Configuration["ConnectionString"]
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是从我的appsettings.json读取设置.我确保在startup.cs上正确加载了设置

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}
Run Code Online (Sandbox Code Playgroud)

但现在是什么?... MS Document显示了如何从控制器读取它.这部分工作正常,我可以在控制器上读取我的设置.但是,我不知道如何将它传递给另一个项目,仍然可以从静态类中调用它.

Fer*_*X32 17

我觉得这可能比必要的工作更多,但我很匆忙所以这就是我到目前为止所做的事情.随时可以发布其他解决方案.

我创建了另一个静态类 AppSettingsProvider.cs

public static class AppSettingsProvider
{
    public static string DbConnectionString { get; set; }
    public static bool IsDevelopment { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我将它们设置在我的Startup.cs上

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();

    BuildAppSettingsProvider();
}
private void BuildAppSettingsProvider()
{
    AppSettingsProvider.ConnectionString = Configuration.GetConnectionString("DBContext");
    AppSettingsProvider.IsDevelopment = Configuration["IsDev"];
}
Run Code Online (Sandbox Code Playgroud)

然后我可以从我的DbContext.cs中调用它

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    string connString = AppSettingsProvider.ConnectionString;
}
Run Code Online (Sandbox Code Playgroud)

PS我尝试将依赖注入方法引入DbContext(通过使用构造函数).但是,这对我不起作用,因为我从静态文件调用DbContext,所以DbContextOptions丢失了.


小智 8

基于与上述相同的原理的简短版本:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    StaticConfig = configuration;
}
public static IConfiguration StaticConfig { get; private set; }
Run Code Online (Sandbox Code Playgroud)

要在另一个static类中使用:

string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");
Run Code Online (Sandbox Code Playgroud)