.NET'te seçenekler deseni
Seçenekler düzeni, ilgili ayar gruplarına kesin olarak belirlenmiş 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 birbirine bağlı 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 class
ile 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
- Desteklemez:
- Uygulama başlatıldıktan sonra yapılandırma verilerinin okunması.
- Adlandırılmış seçenekler
- Singleton olarak kaydedilir ve herhangi bir hizmet ömrüne eklenebilir.
- 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
- Örneklerin seçeneklerini almak ve seçenek bildirimlerini yönetmek için
TOptions
kullanılır. - Singleton olarak kaydedilir ve herhangi bir hizmet ömrüne eklenebilir.
- Destekle -yen:
- Bildirimleri değiştirme
- Adlandırılmış seçenekler
- Yeniden yüklenebilir yapılandırma
- Seçmeli seçenekler geçersiz kılınması (IOptionsMonitorCache<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 kullanım ömrünü bağımlılık ekleme (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:
- Yapılandırma örneğinin
T
değerlendirmesi, eklendiğinde değil erişimine IOptions<TOptions>.Valueertelenmiş olur. Bu önemlidir çünkü seçeneğini çeşitli yerlerden kullanabilirT
ve hakkındaT
hiçbir şey değiştirmeden yaşam süresi semantiğini seçebilirsiniz. - türündeki
T
seçenekleri kaydederken türü açıkça kaydetmenizT
gerekmez. Basit varsayılanlara sahip bir kitaplık yazarken ve çağıranı belirli bir yaşam süresiyle DI kapsayıcısına seçenekleri kaydetmeye zorlamak istemediğinizde bu kolaylık sağlar. - API'nin perspektifinden bakıldığında, tür
T
üzerinde kısıtlamalara izin verir (bu durumda,T
bir başvuru türüyle kısıtlanır).
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çeneklerinIOptionsSnapshot<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
Tür IOptionsMonitor
, değişiklik bildirimlerini destekler ve uygulamanızın yapılandırma kaynağı değişikliklerine dinamik olarak yanıt vermesi gerekebilecek senaryoları etkinleştirir. Bu, uygulama başlatıldıktan sonra yapılandırma verilerindeki değişikliklere tepki vermeniz gerektiğinde kullanışlıdır. Değişiklik bildirimleri yalnızca aşağıdakiler gibi dosya sistemi tabanlı yapılandırma sağlayıcıları için desteklenir:
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
- Microsoft.Extensions.Configuration.KeyPerFile
- Microsoft.Extensions.Configuration.UserSecrets
- Microsoft.Extensions.Configuration.Xml
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_WATCHER
1
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:WeatherStation
bağ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 sealed class 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 OptionsBuilder
kullanılabilir.
OptionsBuilder
, Seçenekler doğrulama bölümünde kullanılır.
Seçenekleri yapılandırmak için DI hizmetlerini kullanma
Seçenekleri yapılandırırken, kayıtlı hizmetlere erişmek için bağımlılık ekleme özelliğini ve seçenekleri yapılandırmak için bunları kullanabilirsiniz. Bu, seçenekleri yapılandırmak için hizmetlere erişmeniz gerektiğinde kullanışlıdır. Hizmetlere DI'den 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.
Yapılandırma temsilcisini Yapılandırma'ya geçirmeniz önerilir çünkü hizmet oluşturmak daha karmaşıktır. 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ı ZedOptions
bir 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:
- Sınıfına bağlanan bir OptionsBuilder<TOptions> almak için
SettingsOptions
çağrılarAddOptions. - kullanarak
DataAnnotations
doğrulamayı etkinleştirmek için çağrılarValidateDataAnnotations.
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ı ValidateOnStart
zincirleyerek 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";
});