.NET'te seçenekler deseni

Seçenekler düzeni, ilgili ayar gruplarına kesin olarak türlenmiş erişim sağlamak için sınıfları kullanır. Yapılandırma ayarları senaryoya göre ayrı sınıflar halinde yalıtıldığında, uygulama iki önemli yazılım mühendisliği ilkesine uyar:

  • Arabirim Ayrım İlkesi (ISS) veya Kapsülleme: Yapılandırma ayarlarına bağlı senaryolar (sınıflar) yalnızca kullandıkları yapılandırma ayarlarına bağlıdır.
  • Endişelerin Ayrılması: Uygulamanın farklı bölümleri için Ayarlar bağımlı değildir veya birbiriyle bağlantılı değildir.

Seçenekler ayrıca yapılandırma verilerini doğrulamak için bir mekanizma sağlar. Daha fazla bilgi için Seçenekler doğrulama bölümüne bakın.

Hiyerarşik yapılandırmayı bağlama

İlgili yapılandırma değerlerini okumanın tercih edilen yolu seçenekler desenini kullanmaktır. Seçenekler deseni, genel tür parametresinin IOptions<TOptions>TOptions bir classile kısıtlandığı arabirim aracılığıyla mümkündür. IOptions<TOptions> daha sonra bağımlılık ekleme yoluyla sağlanabilir. Daha fazla bilgi için bkz . .NET'te bağımlılık ekleme.

Örneğin, bir appsettings.json dosyasından vurgulanan yapılandırma değerlerini okumak için:

{
    "SecretKey": "Secret key value",
    "TransientFaultHandlingOptions": {
        "Enabled": true,
        "AutoRetryDelay": "00:00:07"
    },
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    }
}

Aşağıdaki TransientFaultHandlingOptions sınıflarını oluşturun:

public sealed class TransientFaultHandlingOptions
{
    public bool Enabled { get; set; }
    public TimeSpan AutoRetryDelay { get; set; }
}

Seçenekler desenini kullanırken bir seçenekler sınıfı:

  • Ortak parametresiz oluşturucu ile soyut olmamalıdır
  • Bağlamak için genel okuma-yazma özellikleri içerir (alanlar bağlı değildir)

Aşağıdaki kod Program.cs C# dosyasının bir parçasıdır ve:

  • TransientFaultHandlingOptions sınıfını, "TransientFaultHandlingOptions" bölümüne bağlamak için ConfigurationBinder.Bind çağırır.
  • yapılandırma verisini görüntüler.
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using ConsoleJson.Example;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Configuration.Sources.Clear();

IHostEnvironment env = builder.Environment;

builder.Configuration
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);

TransientFaultHandlingOptions options = new();
builder.Configuration.GetSection(nameof(TransientFaultHandlingOptions))
    .Bind(options);

Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");

using IHost host = builder.Build();

// Application code should start here.

await host.RunAsync();

// <Output>
// Sample output:

Yukarıdaki kodda JSON yapılandırma dosyasının "TransientFaultHandlingOptions" bölümü örneğe TransientFaultHandlingOptions bağlıdır. Bu, C# nesneleri özelliklerini yapılandırmadan ilgili değerlerle nemlendirir.

ConfigurationBinder.Get<T> belirtilen türü bağlar ve döndürür. ConfigurationBinder.Get<T>, ConfigurationBinder.Bind kullanmaktan daha uygun olabilir. Aşağıdaki kod ConfigurationBinder.Get<T> öğesinin, TransientFaultHandlingOptions sınıfıyla nasıl kullanılacağını göstermektedir:

var options =
    builder.Configuration.GetSection(nameof(TransientFaultHandlingOptions))
        .Get<TransientFaultHandlingOptions>();

Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");

Yukarıdaki kodda, ConfigurationBinder.Get<T> temel alınan yapılandırmadan doldurulmuş özellik değerleriyle nesnesinin bir örneğini TransientFaultHandlingOptions almak için kullanılır.

Önemli

ConfigurationBinder sınıfı, ve gibi .Bind(object instance).Get<T>() ile kısıtlanmamışclassçeşitli API'leri kullanıma sunar. Seçenekler arabirimlerinden herhangi birini kullanırken, yukarıda belirtilen seçenekler sınıfı kısıtlamalarına uymanız gerekir.

Seçenekler desenini kullanırken alternatif bir yaklaşım, bölümü bağlamak "TransientFaultHandlingOptions" ve bağımlılık ekleme hizmeti kapsayıcısına eklemektir. Aşağıdaki kodda TransientFaultHandlingOptions, Configure ile hizmet kapsayıcıya eklenmiş ve yapılandırmaya bağlanmıştır:

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Services.Configure<TransientFaultHandlingOptions>(
    builder.Configuration.GetSection(
        key: nameof(TransientFaultHandlingOptions)));

builder Yukarıdaki örnekte bir örneği HostApplicationBuilderyer alır.

İpucu

key parametresi, aranacak yapılandırma bölümünün adıdır. Onu temsil eden türün adıyla eşleşmesi gerekmez. Örneğin, adlı "FaultHandling" bir bölümünüz olabilir ve bu bölüm sınıfı tarafından TransientFaultHandlingOptions temsil edilebilir. Bu örnekte bunun yerine işlevine GetSection geçirirsiniz"FaultHandling". İşleç nameof , adlandırılmış bölüm karşılık gelen türle eşleştiğinde kolaylık olarak kullanılır.

Aşağıdaki kod, önceki kodu kullanarak, konum seçeneklerini okur:

using Microsoft.Extensions.Options;

namespace ConsoleJson.Example;

public sealed class ExampleService(IOptions<TransientFaultHandlingOptions> options)
{
    private readonly TransientFaultHandlingOptions _options = options.Value;

    public void DisplayValues()
    {
        Console.WriteLine($"TransientFaultHandlingOptions.Enabled={_options.Enabled}");
        Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={_options.AutoRetryDelay}");
    }
}

Yukarıdaki kodda, uygulama başlatıldıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunmuyor . Uygulama başlatıldıktan sonra değişiklikleri okumak için IOptionsSnapshot veya IOptionsMonitor'ı kullanarak değişiklikleri meydana geldikçe izleyin ve buna göre tepki gösterin.

Seçenekler arabirimleri

IOptions<TOptions>:

IOptionsSnapshot<TOptions>:

  • Seçeneklerin kapsamlı veya geçici ömürlerde her ekleme çözünürlüğünde yeniden derlenmesi gereken senaryolarda kullanışlıdır. Daha fazla bilgi için bkz . Güncelleştirilmiş verileri okumak için IOptionsSnapshot kullanma.
  • Kapsamlı olarak kaydedilir ve bu nedenle bir Singleton hizmetine eklenemez.
  • Adlandırılmış seçenekleri destekler

IOptionsMonitor<TOptions>:

IOptionsFactory<TOptions> yeni seçenek örnekleri oluşturmakla sorumludur. Tek Create bir yöntemi vardır. Varsayılan uygulama tüm kayıtlı IConfigureOptions<TOptions> ve IPostConfigureOptions<TOptions> tüm yapılandırmaları önce çalıştırır, ardından yapılandırma sonrası. ve IConfigureOptions<TOptions> arasında IConfigureNamedOptions<TOptions> ayrım gerçekleştirir ve yalnızca uygun arabirimi çağırır.

IOptionsMonitorCache<TOptions> tarafından IOptionsMonitor<TOptions> örnekleri önbelleğe TOptions almak için kullanılır. değerin IOptionsMonitorCache<TOptions> yeniden derlenebilmesi için izleyicideki seçenek örneklerini geçersiz kılır (TryRemove). Değerler ile TryAddel ile tanıtılabilir. yöntemi Clear , tüm adlandırılmış örneklerin isteğe bağlı olarak yeniden oluşturulması gerektiğinde kullanılır.

IOptionsChangeTokenSource<TOptions>temel alınan TOptions örnekteki IChangeToken değişiklikleri izleyen öğesini getirmek için kullanılır. Değişiklik belirteci temel bilgileri hakkında daha fazla bilgi için bkz . Bildirimleri değiştirme.

Seçenekler arabirimlerinin avantajları

Genel sarmalayıcı türü kullanmak, seçeneğin ömrünü DI kapsayıcısından ayırmanıza olanak sağlar. Arabirim, IOptions<TOptions>.Value seçenekler türünüz üzerinde genel kısıtlamalar da dahil olmak üzere bir soyutlama katmanı sağlar. Bu, aşağıdaki yararları sağlar:

Güncelleştirilmiş verileri okumak için IOptionsSnapshot kullanma

kullandığınızda IOptionsSnapshot<TOptions>, seçenekler erişildiğinde istek başına bir kez hesaplanır ve isteğin ömrü boyunca önbelleğe alınır. Yapılandırma değişiklikleri, güncelleştirilmiş yapılandırma değerlerini okumayı destekleyen yapılandırma sağlayıcıları kullanılırken uygulama başlatıldıktan sonra okunur.

ile IOptionsSnapshot arasındaki IOptionsMonitor fark şudur:

  • IOptionsMonitor , her zaman geçerli seçenek değerlerini alan tekil bir hizmettir ve bu da özellikle tek bağımlılıklarda yararlıdır.
  • IOptionsSnapshot kapsamlı bir hizmettir ve nesne oluşturulurken seçeneklerin IOptionsSnapshot<T> anlık görüntüsünü sağlar. Seçenekler anlık görüntüleri, geçici ve kapsamlı bağımlılıklarla kullanılmak üzere tasarlanmıştır.

Aşağıdaki kodda kullanılır IOptionsSnapshot<TOptions>.

using Microsoft.Extensions.Options;

namespace ConsoleJson.Example;

public sealed class ScopedService(IOptionsSnapshot<TransientFaultHandlingOptions> options)
{
    private readonly TransientFaultHandlingOptions _options = options.Value;

    public void DisplayValues()
    {
        Console.WriteLine($"TransientFaultHandlingOptions.Enabled={_options.Enabled}");
        Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={_options.AutoRetryDelay}");
    }
}

Aşağıdaki kod, şunlara bağlanan bir yapılandırma örneğini TransientFaultHandlingOptions kaydeder:

builder.Services
    .Configure<TransientFaultHandlingOptions>(
        configurationRoot.GetSection(
            nameof(TransientFaultHandlingOptions)));

Yukarıdaki kodda Configure<TOptions> yöntemi, bağlanacak bir yapılandırma örneğini TOptions kaydetmek için kullanılır ve yapılandırma değiştiğinde seçenekleri güncelleştirir.

IOptionsMonitor

Seçenekler izleyicisini kullanmak için, seçenekler nesneleri bir yapılandırma bölümünden aynı şekilde yapılandırılır.

builder.Services
    .Configure<TransientFaultHandlingOptions>(
        configurationRoot.GetSection(
            nameof(TransientFaultHandlingOptions)));

Aşağıdaki örnek şunu kullanır IOptionsMonitor<TOptions>:

using Microsoft.Extensions.Options;

namespace ConsoleJson.Example;

public sealed class MonitorService(IOptionsMonitor<TransientFaultHandlingOptions> monitor)
{
    public void DisplayValues()
    {
        TransientFaultHandlingOptions options = monitor.CurrentValue;

        Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
        Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");
    }
}

Yukarıdaki kodda, uygulama başlatıldıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunur.

İpucu

Docker kapsayıcıları ve ağ paylaşımları gibi bazı dosya sistemleri güvenilir bir şekilde değişiklik bildirimleri göndermeyebilir. Bu ortamlarda arabirimini kullanırken IOptionsMonitor<TOptions> ortam değişkenini DOTNET_USE_POLLING_FILE_WATCHER1 olarak ayarlayın veya true dosya sistemini değişiklikler için yoklayın. Değişikliklerin yoklandığı aralık dört saniyede birdir ve yapılandırılamaz.

Docker kapsayıcıları hakkında daha fazla bilgi için bkz . .NET uygulamasını kapsayıcıya alma.

Adlandırılmış seçenekler IConfigureNamedOptions'ın kullanılmasını destekler

Adlandırılmış seçenekler:

  • Birden çok yapılandırma bölümü aynı özelliklere bağlandığında kullanışlıdır.
  • Büyük/küçük harfe duyarlıdır.

Aşağıdaki appsettings.json dosyasını göz önünde bulundurun:

{
  "Features": {
    "Personalize": {
      "Enabled": true,
      "ApiKey": "aGEgaGEgeW91IHRob3VnaHQgdGhhdCB3YXMgcmVhbGx5IHNvbWV0aGluZw=="
    },
    "WeatherStation": {
      "Enabled": true,
      "ApiKey": "QXJlIHlvdSBhdHRlbXB0aW5nIHRvIGhhY2sgdXM/"
    }
  }
}

ve Features:WeatherStationbağlamak Features:Personalize için iki sınıf oluşturmak yerine, her bölüm için aşağıdaki sınıf kullanılır:

public class Features
{
    public const string Personalize = nameof(Personalize);
    public const string WeatherStation = nameof(WeatherStation);

    public bool Enabled { get; set; }
    public string ApiKey { get; set; }
}

Aşağıdaki kod adlandırılmış seçenekleri yapılandırıyor:

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

// Omitted for brevity...

builder.Services.Configure<Features>(
    Features.Personalize,
    builder.Configuration.GetSection("Features:Personalize"));

builder.Services.Configure<Features>(
    Features.WeatherStation,
    builder.Configuration.GetSection("Features:WeatherStation"));

Aşağıdaki kod adlandırılmış seçenekleri görüntüler:

public class sealed Service
{
    private readonly Features _personalizeFeature;
    private readonly Features _weatherStationFeature;

    public Service(IOptionsSnapshot<Features> namedOptionsAccessor)
    {
        _personalizeFeature = namedOptionsAccessor.Get(Features.Personalize);
        _weatherStationFeature = namedOptionsAccessor.Get(Features.WeatherStation);
    }
}

Tüm seçenekler adlandırılmış örneklerdir. IConfigureOptions<TOptions>örnekleri, örneğini hedefleme Options.DefaultName olarak değerlendirilir.string.Empty IConfigureNamedOptions<TOptions> ayrıca uygular IConfigureOptions<TOptions>. varsayılan uygulamasının IOptionsFactory<TOptions> her birini uygun şekilde kullanmak için mantığı vardır. null Adlandırılmış seçenek, belirli bir adlandırılmış örnek yerine tüm adlandırılmış örnekleri hedeflemek için kullanılır. ConfigureAll ve PostConfigureAll bu kuralı kullanın.

OptionsBuilder API'si

OptionsBuilder<TOptions> örnekleri yapılandırmak TOptions için kullanılır. OptionsBuilder sonraki tüm çağrılarda görüntülenmek yerine ilk AddOptions<TOptions>(string optionsName) çağrının yalnızca tek bir parametresi olduğundan adlandırılmış seçeneklerin oluşturulmasını kolaylaştırır. Seçenek doğrulama ve ConfigureOptions hizmet bağımlılıklarını kabul eden aşırı yüklemeler yalnızca aracılığıyla OptionsBuilderkullanılabilir.

OptionsBuilder, Seçenekler doğrulama bölümünde kullanılır.

Seçenekleri yapılandırmak için DI hizmetlerini kullanma

Hizmetlere bağımlılık eklemeden erişilirken seçenekler iki şekilde yapılandırılabilir:

  • Yapılandırma temsilcisini OptionsBuilder<TOptions'da >Yapılandır'a geçirin. OptionsBuilder<TOptions>yapılandırma seçeneklerini yapılandırmak için en fazla beş hizmetin kullanılmasına izin veren Yapılandır aşırı yüklemeleri sağlar:

    builder.Services
        .AddOptions<MyOptions>("optionalName")
        .Configure<ExampleService, ScopedService, MonitorService>(
            (options, es, ss, ms) =>
                options.Property = DoSomethingWith(es, ss, ms));
    
  • veya IConfigureNamedOptions<TOptions> uygulayan IConfigureOptions<TOptions> bir tür oluşturun ve türü hizmet olarak kaydedin.

Bir hizmet oluşturmak daha karmaşık olduğundan Yapılandırma'ya bir yapılandırma temsilcisi geçirmenizi öneririz. Tür oluşturmak, Çerçeve'nin Yapılandır'ı çağırırken yaptığı işlemle eşdeğerdir. Configure çağrısı, belirtilen genel IConfigureNamedOptions<TOptions>hizmet türlerini kabul eden bir oluşturucuya sahip olan geçici bir genel kaydeder.

Seçenekler doğrulaması

Seçenekler doğrulaması, seçenek değerlerinin doğrulanmasına olanak tanır.

Aşağıdaki appsettings.json dosyasını göz önünde bulundurun:

{
  "MyCustomSettingsSection": {
    "SiteTitle": "Amazing docs from Awesome people!",
    "Scale": 10,
    "VerbosityLevel": 32
  }
}

Aşağıdaki sınıf yapılandırma bölümüne bağlanır "MyCustomSettingsSection" ve birkaç DataAnnotations kural uygular:

using System.ComponentModel.DataAnnotations;

namespace ConsoleJson.Example;

public sealed class SettingsOptions
{
    public const string ConfigurationSectionName = "MyCustomSettingsSection";

    [Required]
    [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$")]
    public required string SiteTitle { get; set; }

    [Required]
    [Range(0, 1_000,
        ErrorMessage = "Value for {0} must be between {1} and {2}.")]
    public required int Scale { get; set; }

    [Required]
    public required int VerbosityLevel { get; set; }
}

Önceki SettingsOptions sınıfta, ConfigurationSectionName özelliği bağlanacak yapılandırma bölümünün adını içerir. Bu senaryoda options nesnesi yapılandırma bölümünün adını sağlar.

İpucu

Yapılandırma bölümü adı, bağlandığını yapılandırma nesnesinden bağımsızdır. Başka bir deyişle, adlı "FooBarOptions" bir yapılandırma bölümü adlı ZedOptionsbir options nesnesine bağlanabilir. Bunları aynı şekilde adlandırmak yaygın olsa da, gerekli değildir ve aslında ad çakışmalarına neden olabilir.

Aşağıdaki kod:

builder.Services
    .AddOptions<SettingsOptions>()
    .Bind(Configuration.GetSection(SettingsOptions.ConfigurationSectionName))
    .ValidateDataAnnotations();

ValidateDataAnnotations Uzantı yöntemi, Microsoft.Extensions.Options.DataAnnotations NuGet paketinde tanımlanır.

Aşağıdaki kod yapılandırma değerlerini görüntüler veya doğrulama hatalarını bildirir:

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace ConsoleJson.Example;

public sealed class ValidationService
{
    private readonly ILogger<ValidationService> _logger;
    private readonly IOptions<SettingsOptions> _config;

    public ValidationService(
        ILogger<ValidationService> logger,
        IOptions<SettingsOptions> config)
    {
        _config = config;
        _logger = logger;

        try
        {
            SettingsOptions options = _config.Value;
        }
        catch (OptionsValidationException ex)
        {
            foreach (string failure in ex.Failures)
            {
                _logger.LogError("Validation error: {FailureMessage}", failure);
            }
        }
    }
}

Aşağıdaki kod, temsilci kullanarak daha karmaşık bir doğrulama kuralı uygular:

builder.Services
    .AddOptions<SettingsOptions>()
    .Bind(Configuration.GetSection(SettingsOptions.ConfigurationSectionName))
    .ValidateDataAnnotations()
    .Validate(config =>
    {
        if (config.Scale != 0)
        {
            return config.VerbosityLevel > config.Scale;
        }

        return true;
    }, "VerbosityLevel must be > than Scale.");

Doğrulama çalışma zamanında gerçekleşir, ancak bunun yerine çağrısı ValidateOnStartzincirleyerek başlangıçta gerçekleşecek şekilde yapılandırabilirsiniz:

builder.Services
    .AddOptions<SettingsOptions>()
    .Bind(Configuration.GetSection(SettingsOptions.ConfigurationSectionName))
    .ValidateDataAnnotations()
    .Validate(config =>
    {
        if (config.Scale != 0)
        {
            return config.VerbosityLevel > config.Scale;
        }

        return true;
    }, "VerbosityLevel must be > than Scale.")
    .ValidateOnStart();

.NET 8'den başlayarak, belirli bir seçenek türü için başlangıçta doğrulamayı etkinleştiren alternatif bir API AddOptionsWithValidateOnStart<TOptions>(IServiceCollection, String)kullanabilirsiniz:

builder.Services
    .AddOptionsWithValidateOnStart<SettingsOptions>()
    .Bind(Configuration.GetSection(SettingsOptions.ConfigurationSectionName))
    .ValidateDataAnnotations()
    .Validate(config =>
    {
        if (config.Scale != 0)
        {
            return config.VerbosityLevel > config.Scale;
        }

        return true;
    }, "VerbosityLevel must be > than Scale.");

IValidateOptions karmaşık doğrulama için

Aşağıdaki sınıf şunu uygular IValidateOptions<TOptions>:

using System.Text;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;

namespace ConsoleJson.Example;

sealed partial class ValidateSettingsOptions(
    IConfiguration config)
    : IValidateOptions<SettingsOptions>
{
    public SettingsOptions? Settings { get; private set; } =
        config.GetSection(SettingsOptions.ConfigurationSectionName)
              .Get<SettingsOptions>();

    public ValidateOptionsResult Validate(string? name, SettingsOptions options)
    {
        StringBuilder? failure = null;
    
        if (!ValidationRegex().IsMatch(options.SiteTitle))
        {
            (failure ??= new()).AppendLine($"{options.SiteTitle} doesn't match RegEx");
        }

        if (options.Scale is < 0 or > 1_000)
        {
            (failure ??= new()).AppendLine($"{options.Scale} isn't within Range 0 - 1000");
        }

        if (Settings is { Scale: 0 } && Settings.VerbosityLevel <= Settings.Scale)
        {
            (failure ??= new()).AppendLine("VerbosityLevel must be > than Scale.");
        }

        return failure is not null
            ? ValidateOptionsResult.Fail(failure.ToString())
            : ValidateOptionsResult.Success;
    }

    [GeneratedRegex("^[a-zA-Z''-'\\s]{1,40}$")]
    private static partial Regex ValidationRegex();
}

IValidateOptions doğrulama kodunun bir sınıfa taşınmasını sağlar.

Not

Bu örnek kod, Microsoft.Extensions.Configuration.Json NuGet paketine dayanır.

Yukarıdaki kod kullanılarak, hizmetler aşağıdaki kodla yapılandırılırken doğrulama etkinleştirilir:

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

// Omitted for brevity...

builder.Services.Configure<SettingsOptions>(
    builder.Configuration.GetSection(
        SettingsOptions.ConfigurationSectionName));

builder.Services.TryAddEnumerable(
    ServiceDescriptor.Singleton
        <IValidateOptions<SettingsOptions>, ValidateSettingsOptions>());

Yapılandırma sonrası seçenekler

ile IPostConfigureOptions<TOptions>yapılandırma sonrası ayarlayın. Yapılandırma sonrası tüm IConfigureOptions<TOptions> yapılandırma gerçekleştikten sonra çalıştırılır ve yapılandırmayı geçersiz kılmanız gereken senaryolarda yararlı olabilir:

builder.Services.PostConfigure<CustomOptions>(customOptions =>
{
    customOptions.Option1 = "post_configured_option1_value";
});

PostConfigure , adlandırılmış seçenekleri yapılandırma sonrası için kullanılabilir:

builder.Services.PostConfigure<CustomOptions>("named_options_1", customOptions =>
{
    customOptions.Option1 = "post_configured_option1_value";
});

Tüm yapılandırma örneklerini yapılandırma sonrası yapılandırmak için kullanın PostConfigureAll :

builder.Services.PostConfigureAll<CustomOptions>(customOptions =>
{
    customOptions.Option1 = "post_configured_option1_value";
});

Ayrıca bkz.