如何解决ServiceCollection IOptions<> 不会正确绑定
我正在尝试绑定一些可配置的设置。这些值是通过 app-settings.local.json 提供的。要绑定到的模型称为可配置设置。我尝试按照一些教程来解决问题:
- https://andrewlock.net/how-to-use-the-ioptions-pattern-for-configuration-in-asp-net-core-rc2/
- https://github.com/aspnet/Configuration/issues/411
- Cannot set Configuration from JSON appsettings file in .NET Core project
- ServiceCollection returns null for IOptions even though GetSection is working
我已尝试遵循此处给出的建议并将其应用到我自己的应用程序中。经过 4 个小时的尝试,我无法让它工作。要么我缺乏实现这一点所需的基本知识,要么我忽略了一些东西。
我的 ConfigurableSettings 类的结构如下:
public class ConfigurableSettings
{
public AppSettings _AppSettings;
public DgeSettings _DgeSettings;
public class AppSettings
{
[JsonProperty("SoftDelete")]
public bool SoftDelete { get; set; }
}
public class DgeSettings
{
[JsonProperty("zipFileUrl")]
public string zipFileUrl { get; set; }
[JsonProperty("sourceFileUrl")]
public string sourceFileUrl { get; set; }
}
}
我的 ConfigureServices 的结构如下:
public static void ConfigureServices(IServiceCollection serviceCollection,string[] args)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddOptions();
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("app-settings.local.json",true)
.AddJsonFile("app-settings.json",false)
.Build();
serviceCollection.Configure<ConfigurableSettings>(options => configuration.GetSection("AppSettings").Bind(options));
serviceCollection.Configure<ConfigurableSettings>(options => configuration.GetSection("DgeSettings").Bind(options));
var services = serviceCollection.BuildServiceProvider();
var options = services.GetService<IOptions<ConfigurableSettings>>();
serviceCollection.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(configuration.GetSection("Logging"));
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
});
serviceCollection.AddServices(configuration);
serviceCollection.AddnopCommerceServices(configuration);
serviceCollection.AddTransient<Comparator>();
serviceCollection.AddTransient<UpdateManager>();
serviceCollection.AddTransient<DgeRequestAuthenticator>();
serviceCollection.AddTransient<ISourceConnector,DgeConnector>();
serviceCollection.AddTransient<IDestinationConnector,nopCommerceConnector>();
}
我的 app-settings.local.json 配置如下:
{
"AppSettings": {
"SoftDelete": true
},"DgeSettings": {
"zipFileUrl" : "www.example-url.com","sourceFileUrl" : "www.example-url.com"
}
}
private readonly ConfigurableSettings _settings;
public AlphaBetaService(IOptions<ConfigurableSettings> settings)
{
_settings = settings.Value;
}
有人可以帮我找出我做错了什么吗?
解决方法
不确定您在项目中如何使用 ConfigureServices
方法,实际上 Startup.cs 中的 ConfigureServices
必须是无参数的或仅采用 IServiceCollection
类型的一个参数。
更改您的 ConfigureServices 如下:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("app-settings.local.json",true)
.Build();
services.Configure<ConfigurableSettings>(configuration);
//...
}
}
同时更改您的模型设计,如下所示:
public class ConfigurableSettings
{
public AppSettings AppSettings{ get; set; }
public DgeSettings DgeSettings { get; set; }
}
public class AppSettings
{
[JsonProperty("SoftDelete")]
public bool SoftDelete { get; set; }
}
public class DgeSettings
{
[JsonProperty("zipFileUrl")]
public string zipFileUrl { get; set; }
[JsonProperty("sourceFileUrl")]
public string sourceFileUrl { get; set; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。