مصادر الإعداد وموفّروه
رتّبوا طبقات الإعداد من ملفات JSON ومتغيرات البيئة ومعلمات سطر الأوامر والموفّرات المخصّصة بحسب الأولوية.
مصادر الإعداد وموفّروه درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
الإعدادات في .NET
يقرأ نظام إعدادات ASP.NET Core الإعدادات من مصادر متعددة — ملفات JSON ومتغيرات البيئة ووسائط سطر الأوامر وغير ذلك — ويدمجها في مخزن مسطّح من أزواج المفتاح والقيمة يمكن الوصول إليه من أي مكان في تطبيقك.
appsettings.json
يُعد appsettings.json ملف الإعدادات الافتراضي. ويُحمَّل تلقائيًا بواسطة Host.CreateApplicationBuilder. وتُدمج الإعدادات مع التجاوزات الخاصة بالبيئة.
// appsettings.json
{
"App": {
"Name": "OrderService",
"MaxRetries": 3
},
"ConnectionStrings": {
"Default": "Server=localhost;Database=orders"
}
}
// appsettings.Production.json overrides the above:
{
"ConnectionStrings": {
"Default": "Server=prod-db;Database=orders;..."
}
}قراءة قيم الإعدادات
يمكنك الوصول إلى الإعدادات عبر IConfiguration. وتستخدم المفاتيح ترميز النقطتين للكائنات المتداخلة. ويمكن الوصول إلى المصفوفات باستخدام الفهرس.
// Inject IConfiguration
public class OrderService
{
private readonly IConfiguration _config;
public OrderService(IConfiguration cfg) => _config = cfg;
public void Configure()
{
string? name = _config["App:Name"]; // "OrderService"
int maxRetries = _config.GetValue<int>("App:MaxRetries"); // 3
string? connStr = _config.GetConnectionString("Default");
// Nested section
var section = _config.GetSection("App");
string? appName = section["Name"];
}
}متغيرات البيئة
تتجاوز متغيرات البيئة إعدادات JSON، وهي ضرورية لعمليات النشر داخل الحاويات. وتستبدل الشرطتان السفليتان (__) فواصل النقطتين في المفاتيح المتداخلة.
# Set via shell or docker-compose:
export App__Name="OrderService-Prod"
export App__MaxRetries=5
export ConnectionStrings__Default="Server=prod-db;..."
// Equivalent to:
{
"App": { "Name": "OrderService-Prod", "MaxRetries": 5 },
"ConnectionStrings": { "Default": "Server=prod-db;..." }
}
// Priority: env vars > appsettings.{Environment}.json > appsettings.jsonوسائط سطر الأوامر
تتمتع وسائط سطر الأوامر بأعلى أولوية افتراضيًا. وتستخدم صيغة --key=value أو --key value، مع استخدام النقطتين أو الشرطتين السفليتين المتتاليتين للمفاتيح المتداخلة.
# Override config when launching the app:
dotnet run --App:Name="CLI-Override" --App:MaxRetries=10
# Or:
dotnet run --App__Name="CLI-Override"
// The builder.Configuration.AddCommandLine() is called
// automatically by Host.CreateApplicationBuilder().
// Priority order (highest to lowest):
// 1. Command-line args
// 2. Environment variables
// 3. appsettings.{ASPNETCORE_ENVIRONMENT}.json
// 4. appsettings.jsonUser Secrets
تخزّن User Secrets الإعدادات الحساسة خارج مجلد المشروع أثناء التطوير. ولا تُودَع مطلقًا في نظام التحكم بالمصدر، كما تتجاوز appsettings.json محليًا.
# Initialize user secrets for the project:
dotnet user-secrets init
# Set a secret:
dotnet user-secrets set "Database:Password" "SuperSecret123"
dotnet user-secrets set "Jwt:SecretKey" "dev-only-key"
# List secrets:
dotnet user-secrets list
# Remove:
dotnet user-secrets remove "Database:Password"
# Stored in: ~/.microsoft/usersecrets/{projectId}/secrets.json
# Automatically loaded in Development environment onlyموفّرات إعدادات مخصصة
نفّذ IConfigurationProvider وIConfigurationSource لتحميل الإعدادات من أي مصدر — قاعدة بيانات أو Consul أو Vault أو Redis وغير ذلك.
public class DbConfigProvider : ConfigurationProvider
{
private readonly string _connStr;
public DbConfigProvider(string connStr) => _connStr = connStr;
public override void Load()
{
using var conn = new NpgsqlConnection(_connStr);
conn.Open();
using var cmd = new NpgsqlCommand(
"SELECT key, value FROM app_config", conn);
using var reader = cmd.ExecuteReader();
while (reader.Read())
Data[reader.GetString(0)] = reader.GetString(1);
}
}
public class DbConfigSource : IConfigurationSource
{
private readonly string _connStr;
public DbConfigSource(string connStr) => _connStr = connStr;
public IConfigurationProvider Build(IConfigurationBuilder b)
=> new DbConfigProvider(_connStr);
}تسجيل موفّر مخصص
أضف مصدر إعدادات مخصصًا إلى المنشئ قبل استدعاء Build(). وسيُدرج ضمن سلسلة الأولويات نفسها التي يستخدمها الموفّرون المضمّنون.
var builder = Host.CreateApplicationBuilder(args);
// Add custom DB config provider after appsettings.json
builder.Configuration.Add(
new DbConfigSource(
builder.Configuration.GetConnectionString("Default")!));
// Or as an extension method:
public static class ConfigExtensions
{
public static IConfigurationBuilder AddDatabaseConfig(
this IConfigurationBuilder b, string connStr)
=> b.Add(new DbConfigSource(connStr));
}
// Usage:
builder.Configuration.AddDatabaseConfig(connStr);Azure App Configuration
تعمل Azure App Configuration على توحيد الإعدادات بين الخدمات المصغّرة، مع توفير أعلام الميزات والتسميات وإدارة الإصدارات. ويتكامل الموفّر الرسمي معها كمصدر إعدادات قياسي.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
builder.Configuration.AddAzureAppConfiguration(options =>
options
.Connect(builder.Configuration["AzureAppConfig:ConnectionString"])
.Select(KeyFilter.Any) // all keys
.Select(KeyFilter.Any, "Production") // label override
.UseFeatureFlags(ff =>
ff.CacheExpirationInterval = TimeSpan.FromMinutes(5))
.ConfigureRefresh(r =>
r.Register("App:Version", refreshAll: true)
.SetCacheExpiration(TimeSpan.FromMinutes(1)))
);
app.UseAzureAppConfiguration(); // enable dynamic refreshإعادة تحميل الإعدادات
تدعم بعض الموفّرات اكتشاف التغييرات. ويمكن لموفّر JSON إعادة التحميل عند تغيّر الملف. استخدم IOptionsMonitor<T> للاستجابة إلى التغييرات أثناء تشغيل التطبيق.
// Enable JSON file reload on change:
builder.Configuration.AddJsonFile("appsettings.json",
optional: false, reloadOnChange: true);
// In a service, use IOptionsMonitor (not IOptions) to get live values:
public class FeatureService
{
private readonly IOptionsMonitor<FeatureFlags> _monitor;
public FeatureService(IOptionsMonitor<FeatureFlags> m) => _monitor = m;
public bool IsBetaEnabled
=> _monitor.CurrentValue.BetaEnabled; // always fresh
// React to changes:
public FeatureService(IOptionsMonitor<FeatureFlags> m)
{
_monitor = m;
m.OnChange(flags => Console.WriteLine("Config changed!"));
}
}تحقق سريع
ما الفاصل الذي ينبغي استخدامه لتمثيل مفاتيح إعدادات JSON المتداخلة كمتغيرات بيئة؟
تطبيق عملي: إعدادات من مصادر متعددة
إعداد إنتاجي يجمع بين appsettings ومتغيرات البيئة وUser Secrets، مع ترتيب صريح للأولويات.
var builder = Host.CreateApplicationBuilder(args);
// Default: appsettings.json → appsettings.{env}.json → env vars → CLI
// Add user secrets in development:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// Optionally add Azure Key Vault in production:
if (!builder.Environment.IsDevelopment())
{
var keyVaultUri = builder.Configuration["Azure:KeyVaultUri"]!;
builder.Configuration.AddAzureKeyVault(
new Uri(keyVaultUri), new DefaultAzureCredential());
}
// Now all secrets are available transparently via IConfiguration
var jwtKey = builder.Configuration["Jwt:SecretKey"]!;مراجعة: مصادر الإعدادات وموفّراتها
أهم النقاط:
- تُدمج الإعدادات من مصادر متعددة؛ وتتجاوز المصادر اللاحقة المصادر السابقة
- الأولوية: وسائط سطر الأوامر > متغيرات البيئة > appsettings.{env}.json > appsettings.json
- استخدم
__(شرطتين سفليتين) في متغيرات البيئة للمفاتيح المتداخلة - تحافظ User Secrets على بيانات اعتماد التطوير بعيدًا عن نظام التحكم بالمصدر
- الموفّرات المخصصة: نفّذ
IConfigurationSourceوIConfigurationProvider - استخدم
reloadOnChange: trueمعIOptionsMonitorلتحديث الإعدادات مباشرةً
الأسئلة الشائعة
هل درس «مصادر الإعداد وموفّروه» مجاني؟
نعم — نص درس «مصادر الإعداد وموفّروه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «مصادر الإعداد وموفّروه»؟
رتّبوا طبقات الإعداد من ملفات JSON ومتغيرات البيئة ومعلمات سطر الأوامر والموفّرات المخصّصة بحسب الأولوية. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مصادر الإعداد وموفّروه»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مصادر الإعداد وموفّروه
- الخيارات محدّدة الأنواع باستخدام IOptions
- التحقق من الخيارات والخيارات المسمّاة
- إدارة الأسرار