1

Not sure what I am doing wrong here. IOptions<ConnectionStrings> is not updating with new values.

appSettings.json

"ConnectionStrings": {
    "Database": "UserID={0};Password={1};Host=xyz.com;Port=5432;Database=xyz;Pooling=true;SSL Mode=Require;Trust Server Certificate=true"
  }

Program.cs

public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .SetSecretsAsEnvironmentVariables() //where I am setting environment variable from secret.json
                .UseStartup<Startup>()
                .ConfigureAppConfiguration((hostContext, config) =>
                {
                    var env = hostContext.HostingEnvironment;
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);                        config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
                    config.AddEnvironmentVariables();
                    if (hostContext.HostingEnvironment.IsDevelopment())
                    {
                        config.AddUserSecrets<Program>();
                    }
                })
                .Build();

            host.Run();
        }

StartUp:

public IConfiguration Configuration { get; private set; }
public IHostingEnvironment HostingEnvironment { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
        {
            this.HostingEnvironment = env;
            this.Configuration = configuration;
        }


private void ConfigureAppSettings(IServiceCollection services)
        {
            services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
            Configuration.GetSection("ConnectionStrings").Bind(Service.Configuration.Configuration.ConnectionStrings);
            Service.Configuration.Configuration.ConnectionStrings.Database =
                                string.Format(Service.Configuration.Configuration.ConnectionStrings.Database, "abc",
                                    "xyz"); //here I am setting up new value for UserID and Password.

        }

MyConnectionFactory.cs

 public class ConnectionFactory : IConnectionFactory
    {
        private readonly ConnectionStrings _connectionStrings;

        public ConnectionFactory(IOptions<ConnectionStrings> connectionStrings)
        {
            _connectionStrings = connectionStrings.Value;// Here connection string values are always withn{0},{1}.
        }

        public NpgsqlConnection CreateOpenConnection()
        {
            var conn = new NpgsqlConnection(_connectionStrings.QuoteDatabase);
            conn.Open();
            return conn;
        }

In my ServiceRegistry.cs

ForSingletonOf<IConnectionFactory>().Use<MyConnectionFactory>();
    
ForSingletonOf<ConnectionStrings>().Use(new ConnectionStrings() { Database = Configuration.Configuration.ConnectionStrings.Database });

Don't know What I am doing wrong here. My Connection string values are not updating with new values. If I am changing in MyConnectionFactory.cs from IOptions<ConnectionStrings> to ConnectionStrings the values are updating with new one.

Please anyone me help me out here.

Alexa
  • 11
  • 1
  • Could you explain me what is this code is doing ? Service.Configuration.Configuration.ConnectionStrings.Database =.... where is the value is stored ? and what is the result of Configuration.Configuration.ConnectionStrings.Database in your ServiceRegistry.cs – user3682728 Aug 24 '21 at 04:06
  • This one is I am reading value from Environment Variable and Setting up Database UserId and Password value – Alexa Aug 24 '21 at 05:15
  • Why not reading environment variable when using the connection string in `ConnectionFactory` class? I think it's much easier that this [high vote answer](https://stackoverflow.com/a/42705862/14574199) about updating value in appsetting file. – Tiny Wang Aug 24 '21 at 06:48

0 Answers0