Search code examples
c#.net-coreazure-functions.net-8.0

How can I access configuration, defined in `ConfigureAppConfiguration`, in `ConfigureServices`, with only the `IServiceCollection` available?


I'm implementing an Azure Function using C#/.NET 8.0. After setting up in ConfigureAppConfiguration, I want to access in ConfigureServices for configuring Entity Framework Core with a connection string.

It's shown here how to get configuration in a class through dependency injection. It's shown here how to get configuration using the options pattern and defining the configuration using services.AddOptions<MyConfigOptions>().

However, in my case, I just want to access the configuration using its key, like "ConnectionStrings:MyConnectionString", not by defining classes to use in conjunction with AddOptions<>.

using System.Configuration;
using Azure.Identity;
using IAM_AssetOwnershipWatchdog.DbContexts;
using IAM_AssetOwnershipWatchdog.Services;
using Microsoft.Azure.Functions.Worker;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Graph;
using ConfigurationManager = System.Configuration.ConfigurationManager;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureAppConfiguration(builder =>
    {
        var environment = Environment.GetEnvironmentVariable("ENVIRONMENT") ?? "development";

        builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();
    })
    .ConfigureServices(services => {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();

        services.AddDbContext<AssetOwnershipContext>(options =>
        {
            // How to access configuration here?
            // options.UseSqlServer(...)
        });
        
        services.AddScoped<IApplicationService, ApplicationService>();
        services.AddSingleton<GraphServiceClient>(sp =>
            new GraphServiceClient(
                new DefaultAzureCredential(new DefaultAzureCredentialOptions()
                {
                    ExcludeSharedTokenCacheCredential = true
                })
            )
        );
    })
    .Build();

host.Run();

Solution

  • You can use the IHostBuilder.ConfigureServices which accepts lambda with 2 parameters, first being the HostBuilderContext which has the Configuration property:

    var host = new HostBuilder()
        .ConfigureAppConfiguration(builder => ...)
        .ConfigureServices((context, services) =>  {
            var config = context.Configuration;
            // 
        })