Muflix
Muflix

Reputation: 6768

How to simply read from appsettings.json

I have appsettings.json

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "ConnectionString": "Server=...;Database=...;Trusted_Connection=True;"

}

and Database class

public class Database : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder.UseSqlServer(@"Server=...;Database=...;Trusted_Connection=True;");

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Material>().ToTable("vw_Material", schema: "query");
        }

        public virtual DbSet<Material> Material { get; set; }
    }

My question is, how to replace this line

optionsBuilder.UseSqlServer(@"Server=...;Database=...;Trusted_Connection=True;");

with value from appsettings ?

Upvotes: 3

Views: 1390

Answers (1)

Alex Riabov
Alex Riabov

Reputation: 9165

You can use DI for this purpose. To do that you need to register Configuration in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
   ...    
   services.AddSingleton<IConfiguration>(Configuration);
}

Then you can inject it to Database constructor:

private readonly IConfiguration configuration;

public Database(IConfiguration config) 
{
    configuration = config;
}

and access it on configuring:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder.UseSqlServer(configuration.GetConnectionString("ConnectionString"));

Another option is to use Options pattern. In this case you have to create a class with the property which you need:

public class ConnectionStringConfig
{
    public string ConnectionString { get; set; }
}

Register it on Startup:

public void ConfigureServices(IServiceCollection services)
{
   ...    
   services.Configure<ConnectionStringConfig>(Configuration);
}

Inject to Database constructor:

private readonly ConnectionStringConfig configuration;

public Database(IOptions<ConnectionStringConfig> config) 
{
    configuration = config.Value;
}

and access it on configuring:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder.UseSqlServer(configuration.ConnectionString);

Upvotes: 5

Related Questions