IValidateOptions<TOptions> و IValidatableObject ✨
کلاس زیر رابط <IValidateOptions<TOptions را پیادهسازی میکند:
public class MyConfigValidation : IValidateOptions<MyConfigOptions>
{
public MyConfigOptions _config { get; private set; }
public MyConfigValidation(IConfiguration config)
{
_config = config.GetSection(MyConfigOptions.MyConfig)
.Get<MyConfigOptions>();
}
public ValidateOptionsResult Validate(string name, MyConfigOptions options)
{
string? vor = null;
var rx = new Regex(@"^[a-zA-Z''-'\s]{1,40}$");
var match = rx.Match(options.Key1!);
if (string.IsNullOrEmpty(match.Value))
{
vor = $"{options.Key1} doesn't match RegEx \n";
}
if ( options.Key2 < 0 || options.Key2 > 1000)
{
vor = $"{options.Key2} doesn't match Range 0 - 1000 \n";
}
if (_config.Key2 != default)
{
if(_config.Key3 <= _config.Key2)
{
vor += "Key3 must be > than Key2.";
}
}
if (vor != null)
{
return ValidateOptionsResult.Fail(vor);
}
return ValidateOptionsResult.Success;
}
}
ءIValidateOptions این امکان را فراهم میکند که کد اعتبارسنجی از فایل Program.cs خارج شده و در یک کلاس قرار گیرد. 🧩
با استفاده از کد بالا، اعتبارسنجی در فایل Program.cs با کد زیر فعال میشود:
using Microsoft.Extensions.Options;
using OptionsValidationSample.Configuration;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.Configure<MyConfigOptions>(builder.Configuration.GetSection(
MyConfigOptions.MyConfig));
builder.Services.AddSingleton<IValidateOptions
<MyConfigOptions>, MyConfigValidation>();
var app = builder.Build();
اعتبارسنجی Options همچنین از IValidatableObject پشتیبانی میکند. برای انجام اعتبارسنجی سطح کلاس در داخل خود کلاس:
رابط IValidatableObject و متد Validate را در کلاس پیادهسازی کنید.
در Program.cs متد ValidateDataAnnotations را فراخوانی کنید. ✔️
ValidateOnStart 🚀
اعتبارسنجی Options اولین باری که یک نمونه از TOption ساخته میشود اجرا میگردد. این یعنی مثلاً زمانیکه اولین دسترسی به IOptionsSnapshot<TOptions>.Value در pipeline یک درخواست رخ میدهد یا زمانیکه IOptionsMonitor<TOptions>.Get(string) فراخوانی میشود. پس از reload شدن تنظیمات، اعتبارسنجی دوباره اجرا میشود.
زمان اجرا از OptionsCache<TOptions> برای کش کردن نمونه ساختهشده استفاده میکند.
برای اجرای اعتبارسنجی هنگام شروع اپلیکیشن (Eager Validation) باید در Program.cs متد زیر را فراخوانی کنید:
builder.Services.AddOptions<MyConfigOptions>()
.Bind(builder.Configuration.GetSection(MyConfigOptions.MyConfig))
.ValidateDataAnnotations()
.ValidateOnStart();
Options post-configuration 🛠
ءPost-configuration را میتوان با <IPostConfigureOptions<TOptions انجام داد. Post-configuration پس از اجرای تمام <IConfigureOptions<TOptions انجام میشود:
using OptionsValidationSample.Configuration;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddOptions<MyConfigOptions>()
.Bind(builder.Configuration.GetSection(MyConfigOptions.MyConfig));
builder.Services.PostConfigure<MyConfigOptions>(myOptions =>
{
myOptions.Key1 = "post_configured_key1_value";
});