Skip to content

Dotnet 9 Functions IHostApplicationBuilder #3773

@cliedeman

Description

@cliedeman

Problem Statement

Dotnet 9 has included support for using the IHostApplicationBuilder style for app creation

https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide?tabs=ihostapplicationbuilder%2Cwindows#start-up-and-configuration

With the new style we dont have access to the HostBuilderContext

var builder = FunctionsApplication.CreateBuilder(args);

builder.UseSentry(<missing>, options =>
{
    ...
});

Temporary workaround:

var builder = FunctionsApplication.CreateBuilder(args);

var context = new HostBuilderContext(new Dictionary<object, object>())
{
    Configuration = builder.Configuration,
};

builder.UseSentry(context, options =>
{
    ...
});

I see 2 obvious solutions:

Either add a builder extension with using FunctionsApplicationBuilder

or do a cast

    public static IHostApplicationBuilder UseSentry(
        this IFunctionsWorkerApplicationBuilder builder,
        Action<SentryAzureFunctionsOptions>? optionsConfiguration)
    {
        builder.UseMiddleware<SentryFunctionsWorkerMiddleware>();
        IServiceCollection services = builder.Services;
        IConfigurationSection section;
        if (builder is IHostApplicationBuilder applicationBuilder)
        {
            section = applicationBuilder.Configuration.GetSection("Sentry");
        }
        else
        {
            throw new ArgumentException("builder is not a IHostApplicationBuilder");
        }
        
        services.AddSingleton<IConfigureOptions<SentryAzureFunctionsOptions>>((Func<IServiceProvider, IConfigureOptions<SentryAzureFunctionsOptions>>) (_ => (IConfigureOptions<SentryAzureFunctionsOptions>) new SentryAzureFunctionsOptionsSetup((IConfiguration) section)));
        if (optionsConfiguration != null)
            services.Configure<SentryAzureFunctionsOptions>(optionsConfiguration);
        services.AddLogging();
        services.AddSingleton<ILoggerProvider, SentryAzureFunctionsLoggerProvider>();
        services.AddSingleton<IConfigureOptions<SentryAzureFunctionsOptions>, SentryAzureFunctionsOptionsSetup>();
        services.AddSentry<SentryAzureFunctionsOptions>();
        return builder;
    }

Solution Brainstorm

No response

Metadata

Metadata

Assignees

Projects

Status

Done

Status

No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions