C# Geeks (.NET)
334 subscribers
128 photos
1 video
98 links
Download Telegram
⚙️ کار با منابع مختلف کانفیگ

سیستم کانفیگ ASP.NET Core از چندین منبع پشتیبانی می‌کند. هنگام استفاده از Options Pattern با FluentValidation، به یاد داشته باشید که اعتبارسنجی صرف‌نظر از منبع کار می‌کند:

🔹️متغیرهای محیطی (Environment variables)
🔹️Azure Key Vault
🔹️User secrets
🔹️فایل‌های JSON
🔹️کانفیگ در حافظه (In-memory configuration)

این ویژگی مخصوصاً برای برنامه‌های containerized مفید است که کانفیگ از طریق متغیرهای محیطی یا secretهای mount شده می‌آید.

🧪 تست Validatorهای خود

یکی از مزایای استفاده از FluentValidation این است که Validatorها بسیار آسان تست می‌شوند:
// استفاده از متدهای کمکی FluentValidation.TestHelper
[Fact]
public void GitHubSettings_WithMissingAccessToken_ShouldHaveValidationError()
{
// Arrange
var validator = new GitHubSettingsValidator();
var settings = new GitHubSettings { RepositoryName = "test-repo" };

// Act
TestValidationResult<GitHubSettings>? result = await validator.TestValidate(settings);

// Assert
result.ShouldNotHaveAnyValidationErrors();
}


خلاصه

با ترکیب FluentValidation با Options Pattern و ()ValidateOnStart، یک سیستم اعتبارسنجی قدرتمند ایجاد می‌کنیم که تضمین می‌کند کانفیگ برنامه درست باشد از همان ابتدا.

مزایای این روش:

• قوانین اعتبارسنجی بیان‌گراتر و انعطاف‌پذیرتر نسبت به Data Annotations

• جداسازی منطق اعتبارسنجی از مدل‌های کانفیگ

• کشف خطاهای کانفیگ در زمان startup برنامه

• پشتیبانی از سناریوهای اعتبارسنجی پیچیده

• قابلیت تست آسان

این الگو به ویژه در معماری‌های میکروسرویس یا برنامه‌های containerized ارزشمند است، جایی که خطاهای کانفیگ باید فوراً تشخیص داده شوند و نه در زمان اجرا.

به یاد داشته باشید که Validatorهای خود را به درستی ثبت کنید و از ()ValidateOnStart استفاده کنید تا اعتبارسنجی در زمان شروع برنامه اجرا شود.

🏷 هشتگ‌ها:
#ASPNetCore #FluentValidation #OptionsPattern #Validation
ءPostConfigure برای Named Options نیز قابل استفاده است:
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.Configure<TopItemSettings>(TopItemSettings.Month,
builder.Configuration.GetSection("TopItem:Month"));
builder.Services.Configure<TopItemSettings>(TopItemSettings.Year,
builder.Configuration.GetSection("TopItem:Year"));

builder.Services.PostConfigure<TopItemSettings>("Month", myOptions =>
{
myOptions.Name = "post_configured_name_value";
myOptions.Model = "post_configured_model_value";
});

var app = builder.Build();

برای post-config کردن تمام نمونه‌های تنظیمات از PostConfigureAll استفاده می‌شود:
using OptionsValidationSample.Configuration;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

builder.Services.AddOptions<MyConfigOptions>()
.Bind(builder.Configuration.GetSection(MyConfigOptions.MyConfig));

builder.Services.PostConfigureAll<MyConfigOptions>(myOptions =>
{
myOptions.Key1 = "post_configured_key1_value";
});


Access options in Program.cs 🔍

برای دسترسی به <IOptions<TOptions یا <IOptionsMonitor<TOptions در Program.cs، باید از GetRequiredService روی WebApplication.Services استفاده کنید:
var app = builder.Build();

var option1 = app.Services.GetRequiredService<IOptionsMonitor<MyOptions>>()
.CurrentValue.Option1;

🔖هشتگ‌ها:
#aspnetcore #dotnet #csharp #optionspattern #configuration #softwarearchitecture #cleanarchitecture