'How to get AppSetting values in startup by using services in asp.net core?

I want to get value of appsetting inside StartUp and also using services for saving them. I create a static IServiceCollection method for AddTransient my custom service. I define a readonly variable for keep the appsetting values. My problem is that, this service creates new instance for readonly variable, for all calling.how can I prevent this?

and I have a question that other extensions like AddOpenIdConnect, how to work with their configs, I mean how to save and use them?

this is startup:

 public void ConfigureServices(IServiceCollection services){
...

 services.AddMyIntegration(conf =>
            {
                conf.ConnectionString = Configuration.GetConnectionString("Integration");
                conf.AgentApiAddress = Configuration["AgentApiAddress"];
            });

}

....

public static class MyExtension
    {
        public static IServiceCollection AddMyIntegration(this IServiceCollection services, Action<MyConstantsProvider> myConstantsProvider)
        {
            services.AddTransient((t) =>
            {
                return new MyService(myConstantsProvider);
            });

            return services;
        }
    }

this is my service:

public class MyService
    {
        public readonly MyConstantsProvider Provider;

        public MyService(Action<MyConstantsProvider> configure)
        {
            Provider = new MyConstantsProvider();
            configure(Provider);
        }
    }

 public class MyConstantsProvider
    {
        public string ConnectionString { get; set; }
        public string AgentApiAddress { get; set; }
    }

Update my question: Finally I fixed my issue by add MyConstantsProvider as singletone instead of MyService so this creates new instance of variable at the first time in extension class:

public static class MyExtension
        {
            public static IServiceCollection AddMyIntegration(this IServiceCollection services, Action<MyConstantsProvider> myConstantsProvider)
            {
    var provider = new MyConstantsProvider();
                myConstantsProvider(provider);
                services.AddSingleton(provider);
                services.AddTransient<MyService>();
                return services;
            }
        }

this is MyService class:

public class MyService
    {
        public readonly MyConstantsProvider Provider;

        public MyService(MyConstantsProvider provider)
        {
            Provider = provider;
        }
    }


Solution 1:[1]

I wonder why we make it so complicated ? I just saw we're trying to read appsettings later in the application somewhere, and for this, the framework have default implementation to back us up.

Our app settings might look like

{
    "Catalog": {
        "ConnectionString": "SomeConnection",
        "AgentApiAddress": "http://somewhere.dev"
    }
}

Then our class could be

public class MySetting
{
    public string ConnectionString { get; set; }
    public string AgentApiAddress{ get; set; }
}

Config register it in startup (or somewhere we like in .net 6)

services.Configure<MySetting>(configuration.GetSection("Catalog"));

Retrive it later in the app via DI

public class SomeService
{
    private readonly MySetting _setting;

    public SomeService(IOptions<MySetting> config)
    {
        _setting = config.Value;
    }
}

For setting that can be change dynamically, take a look at IOptionsMonitor

Or that might be some special case that I miss ?

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Gordon Khanh Ng.