private static void Main()

in src/ApiForFhirMigrationTool.Function/Program.cs [33:132]


    private static void Main(string[] args)
    {
        MigrationOptions config = new();

        var host = new HostBuilder()
            .ConfigureAppConfiguration((hostingContext, configuration) =>
            {
                configuration.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddUserSecrets(Assembly.GetExecutingAssembly(), true)
                .AddEnvironmentVariables("AZURE_");

                IConfigurationRoot configurationRoot = configuration.Build();
                configurationRoot.Bind(config);
            })
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        var credential = new DefaultAzureCredential();

        //When client want to use client credentials for gen1
        ClientSecretCredential? clientcred =config.ClientCredential? new ClientSecretCredential(config.TenantId, config.ClientId, config.ClientSecret):null;


        if (config.AppInsightConnectionstring != null)
        {
            services.AddLogging(builder =>
            {
                builder.AddFilter<ApplicationInsightsLoggerProvider>(string.Empty, config.Debug ? LogLevel.Debug : LogLevel.Information);
                builder.AddApplicationInsights(op => op.ConnectionString = config.AppInsightConnectionstring, op => op.FlushOnDispose = true);
            });

            services.Configure<TelemetryConfiguration>(options =>
            {
                options.ConnectionString = config.AppInsightConnectionstring;
            });
            services.AddTransient<TelemetryClient>();
        }

        services.AddTransient<IOrchestrationHelper, OrchestrationHelper>();

        services.AddTransient<ISurfaceCheck, SurfaceCheck>();
        services.AddTransient<IDeepCheck, DeepCheck>();

        services.AddTransient<IAzureTableClientFactory, AzureTableClientFactory>();
        services.AddTransient<IAzureBlobClientFactory, AzureBlobClientFactory>();
        services.AddTransient<IMetadataStore, AzureTableMetadataStore>();

        TableClientOptions opts = new TableClientOptions(TableClientOptions.ServiceVersion.V2019_02_02);
        opts.Retry.Delay = TimeSpan.FromSeconds(5);
        opts.Retry.Mode = RetryMode.Fixed;
        opts.Retry.MaxRetries = 3;

        BlobClientOptions blobOpts = new BlobClientOptions(BlobClientOptions.ServiceVersion.V2019_02_02);
        blobOpts.Retry.Delay = TimeSpan.FromSeconds(5);
        blobOpts.Retry.Mode = RetryMode.Fixed;
        blobOpts.Retry.MaxRetries = 3;


        services.AddSingleton<TableServiceClient>(new TableServiceClient(new Uri(config.StagingStorageUri), credential, opts));

        services.AddSingleton<BlobServiceClient>(new BlobServiceClient(new Uri(config.BlobStorageUri), credential, blobOpts));


        services.AddTransient<IFhirProcessor, FhirProcessor>();

        services.AddScoped<IFhirClient, FhirClient>();

        services.AddTransient<ISearchParameterOperation, SearchParameterOperation>();
        services.AddSingleton(config);

        var baseUri = config.SourceUri;
        var desUri = config.DestinationUri;
        string[]? scopes = default;

#pragma warning disable CS8604 // Possible null reference argument.
        services.AddHttpClient(config.SourceHttpClient, httpClient =>
        {
            httpClient.DefaultRequestHeaders.Add(HeaderNames.UserAgent, config.UserAgent);
            httpClient.BaseAddress = baseUri;
        })
        .AddPolicyHandler(GetRetryPolicy())
       .AddHttpMessageHandler(x => new BearerTokenHandler(config.ClientCredential? clientcred : credential, baseUri, scopes));

#pragma warning restore CS8604 // Possible null reference argument.

#pragma warning disable CS8604 // Possible null reference argument.
        services.AddHttpClient(config.DestinationHttpClient, client =>
        {
            client.DefaultRequestHeaders.Add(HeaderNames.UserAgent, config.UserAgent);
            client.BaseAddress = desUri;
        })
        .AddPolicyHandler(GetRetryPolicy())
        .AddHttpMessageHandler(x => new BearerTokenHandler(credential, desUri, scopes));
#pragma warning restore CS8604 // Possible null reference argument.

    })
    .Build();

        host.Run();
    }