我正在使用asp.net + Autofac。
我正在尝试加载自定义JSON配置文件,并根据它创建/实例IConfiguration实例,或者至少将我的文件包含到默认情况下的任何IConfiguration asp.net构建中。
我的问题是asp.net似乎覆盖了IConfiguration的依赖注册。
我似乎无法注册我自己的IConfiguration对象 - DI容器将始终将其解析为一些似乎由asp.net库本身生成的实例。
而且我不确定如何让asp.net至少另外加载我的自定义配置文件 - 即如果有任何方法可以获得它所使用的ConfigurationBuilder,并在它之前添加我自己的文件构建IConfiguration对象。
我尝试了以下内容:
public class Startup
{
public IConfigurationRoot Configuration { get; }
public Startup(IHostingEnvironment env)
{
this.Configuration = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("somefile.json")
.Build();
}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add framework services.
services
.AddMvc()
.AddControllersAsServices();
var builder = new ContainerBuilder();
builder.Register(x => this.Configuration).As<IConfiguration>();
builder.Populate(services);
var container = builder.Build();
// This will return another IConfiguration instance then the one I registered;
// namely One that contains 1 provider, a MemoryConfigurationProvider
var xxx = container.Resolve<IConfiguration>();
return new AutofacServiceProvider(container);
}
}
如何让asp.net加载我的自定义JSON配置文件?
答案 0 :(得分:8)
您可以使用Options模式执行此操作:
在ASP.NET Core 2上,在Program.cs
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
// custom config file
.AddJsonFile("myappconfig.json", optional: false, reloadOnChange: false)
.Build();
BuildWebHost(args, configuration).Run();
}
public static IWebHost BuildWebHost(string[] args, IConfiguration config) =>
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
.UseStartup<Startup>()
.Build();
}
创建一个与您的配置文件匹配的类:
public class MyAppConfig
{
public string SomeConfig { get; set; }
public int NumberConfig { get; set; }
}
在ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MyAppConfig>(Configuration);
}
然后,只需在您的控制器中访问它:
[Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly MyAppConfig _appConfig;
public ValuesController(IOptions<MyAppConfig> optionsAccessor)
{
if (optionsAccessor == null) throw new ArgumentNullException(nameof(optionsAccessor));
_appConfig = optionsAccessor.Value;
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return _appConfig.SomeConfig;
}
}
如果您尚未使用ASP.NET Core 2,则该过程几乎相同。您只需在Startup.cs
上添加自定义配置文件即可。其余基本相同。
答案 1 :(得分:4)
从 ASP.NET Core 5.0 开始,它就像在 Program.cs 内部对 CreateDefaultBuilder(args) 的调用中添加对 ConfigureAppConfiguration() 的调用一样简单:
来自
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
到
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("CustomSettings.json", optional: false, reloadOnChange: false);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
答案 2 :(得分:0)
对于.Net Core 2.2,您需要修改Program.cs:
之前
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
之后
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//This is how you attach additional JSON files
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("customSettings.json", optional: false, reloadOnChange: false);
})
//End of update
.UseStartup<Startup>();
有关最新修正以及要添加其他种类的自定义设置,请参阅以下article上的Microsoft文档。