首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ServiceCollection IOptions<>不能正确地绑定

ServiceCollection IOptions<>不能正确地绑定
EN

Stack Overflow用户
提问于 2021-06-14 15:07:18
回答 1查看 489关注 0票数 1

我试图绑定一些可配置的设置。这些值是通过app-setings.local.json提供的。要绑定到的模型称为“可配置设置”。我尝试学习一些教程并解决这个问题:

  1. https://andrewlock.net/how-to-use-the-ioptions-pattern-for-configuration-in-asp-net-core-rc2/
  2. https://github.com/aspnet/Configuration/issues/411
  3. Cannot set Configuration from JSON appsettings file in .NET Core project
  4. ServiceCollection returns null for IOptions even though GetSection is working

我试图遵循这里给出的建议,并在我自己的应用程序中应用它。经过4个小时的尝试,我没能让它开始工作。要么我缺乏实现这一目标所需的基本知识,要么我忽略了一些东西。

我的ConfigurableSettings类的结构如下:

代码语言:javascript
运行
复制
    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的结构如下:

代码语言:javascript
运行
复制
    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-setings.local.json配置如下:

代码语言:javascript
运行
复制
{
  "AppSettings": {
    "SoftDelete": true
  },

  "DgeSettings": {
    "zipFileUrl" : "www.example-url.com",
    "sourceFileUrl" : "www.example-url.com"
  }
}

当我试图在类中使用它时,我在构造函数中调用它,如下所示:

代码语言:javascript
运行
复制
private readonly ConfigurableSettings _settings;
        
        public AlphaBetaService(IOptions<ConfigurableSettings> settings)
        {
            _settings = settings.Value;
        }

有人能帮我找出我做错了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2021-06-15 02:32:56

不确定如何在项目中使用ConfigureServices方法,实际上,Startup.cs中的ConfigureServices必须是无参数的,或者只能接受IServiceCollection类型的一个参数。

将您的ConfigureServices更改如下:

代码语言:javascript
运行
复制
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);

        //...
    }
}

还可以更改模型设计,如下所示:

代码语言:javascript
运行
复制
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; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67972780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档