ASP.NET vNext全局配置访问
访问ASP.NET vNext中的ASP.NET vNext全局配置访问,asp.net,asp.net-core,Asp.net,Asp.net Core,访问ASP.NET vNext中的config.json文件(或存储config的其他位置)的正确/推荐方法是什么 在Startup类中,我设置了如下配置: public class Startup { public IConfiguration Configuration { get; set; } public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) { var configurati
config.json
文件(或存储config的其他位置)的正确/推荐方法是什么
在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();
}
但是如果我需要在其他地方访问连接字符串,我该如何做呢?例如,在EF上下文的onconfigurang
中,如何获取连接字符串:
protected override void OnConfiguring(EntityOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer( ??? );
我读到你可以用这个:
var config = Startup.Configuration
?? new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
但是(a)启动不是静态的,并且(b)您肯定不想在每次需要时都重新构建配置设置-这会在使用它的地方复制代码
我也读过你应该使用的文章,但是这个链接并没有完全告诉你怎么做。如果我的DbContext构造函数有一个注入的参数,那么如何将其注入无参数BaseApiController
这似乎是一个常见/简单的要求:在启动中配置之后,如何在其他地方访问该配置?这应该出现在所有的文档/示例中 以下是我得到的有效信息: 启动
首先,应该避免将数据库上下文注册为单例。另外,传递原始
IConfiguration
接口也不是一个好做法
相反,您可以创建一个POCO选项类:
public class DbOptions
{
public string ConnectionString { get; set }
}
并使用config.json中的部分将其填充到ConfigureServices
方法中:
services.Configure<DbOptions>(Configuration.GetConfigurationSection("Data:DefaultConnection"));
谢谢这里有一篇我刚刚发现的非常好的文章:一个缺点:我使用了一个BaseApiController来实例化和处理上下文,所有的控制器都继承了它。现在我不能使用该模式,因为BaseApiController需要一个无参数构造函数。你知道怎么避开吗?我基本上就是这么解释的。不过,那篇文章中使用的
配置
类有点过时了。现在必须使用ConfigurationBuilder
,然后调用Build
。
[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());
}
}
public class DbOptions
{
public string ConnectionString { get; set }
}
services.Configure<DbOptions>(Configuration.GetConfigurationSection("Data:DefaultConnection"));
public sealed class Context : IdentityDbContext<IdentityUser>
{
private readonly DbOptions _options;
public DbSet<Client> Clients { get; set; }
public Context(IOptions<DbOptions> optionsAccessor)
{
// store the injected options
_options = optionsAccessor.Options;
}
// other code..
}