ASP.NET vNext 全局配置访问

2024-04-15

正确/推荐的访问方式是什么config.jsonASP.NET vNext 中的文件(或存储配置的其他位置)?

In the Startup类,我像这样设置配置:

public class Startup
{
    public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();

    Configuration = configurationBuilder.Build();
}

但是如果我需要在其他地方访问连接字符串,我该怎么做呢?例如,在OnConfiguringEF 上下文中,如何获取连接字符串:

protected override void OnConfiguring(EntityOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer( ??? );

我读到你可以使用这个:

var config = Startup.Configuration
    ?? new Configuration()
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();

但是(a)启动不是静态的,并且(b)您肯定不想每次需要时都重新构建配置设置 - 这是在使用它的所有地方重复代码。

我还读到你应该使用依赖注入 https://github.com/aspnet/Announcements/issues/25,但该链接并未完全向您展示如何操作。如果我的 DbContext 构造函数有一个注入参数,那么如何将其注入到无参数 BaseApiController 中?

这看起来确实是一个常见/简单的要求:在启动中配置后,如何在其他地方访问该配置?这应该在文档/示例中随处可见。


这是我所得到的有效的:

Startup

public class Startup
{
    public IConfiguration Configuration { get; set; }

    public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
    {
        // create & store the configuration once
        var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();

        Configuration = configurationBuilder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<Context>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<User, IdentityRole>()
                .AddEntityFrameworkStores<Context>()
                .AddDefaultTokenProviders();

        services.AddMvc();

        // adding/registering the dbContext for dependency injection as a singleton
        services.AddSingleton(s => new Context(Configuration));
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseIdentity();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                  name: "default",
                  template: "{controller}/{action}/{id?}",
                  defaults: new { controller = "Home", action = "Index" });
        });
    }
}

数据库上下文

public sealed class Context : IdentityDbContext<IdentityUser>
{
    private readonly IConfiguration _config;
    public DbSet<Client> Clients { get; set; }

    public Context(IConfiguration config)
    {
        // store the injected config
        _config = config;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ForSqlServer().UseIdentity();
        base.OnModelCreating(modelBuilder);
    }

    protected override void OnConfiguring(EntityOptionsBuilder optionsBuilder)
    {
        // use the injected config
        optionsBuilder.UseSqlServer(_config.Get("Data:DefaultConnection:ConnectionString"));

        base.OnConfiguring(optionsBuilder);
    }
}

控制器

[Route("api/[controller]")]
public class TestController : BaseController
{
    private readonly Context _context;

    // have the context injected
    public TestController(Context context)
    {
        _context = context;
    }

    [HttpGet]
    public ActionResult Get()
    {
        return new ObjectResult(_context.Clients.ToList());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET vNext 全局配置访问 的相关文章

随机推荐