البرمجة

ضبط الإعدادات في ‎.NET

ضبط الإعدادات Settings في ‎.NET: آلية الإدارة والتكوين وأفضل الممارسات

تُعد عملية ضبط الإعدادات (Settings) في بيئة التطوير ‎.NET من العناصر الجوهرية التي تُسهم في بناء تطبيقات مرنة، قابلة لإعادة التكوين، وأكثر قدرة على التكيّف مع بيئات التشغيل المختلفة. في التطبيقات الحديثة، سواء كانت مكتبية (Desktop) أو ويب (Web) أو سحابية (Cloud-based)، يلعب ملف الإعدادات دوراً بالغ الأهمية في تحديد سلوك البرنامج من خلال تخزين القيم التي يمكن تغييرها دون الحاجة إلى إعادة ترجمة الكود. هذه القيم قد تشمل سلاسل الاتصال بقواعد البيانات، مسارات الملفات، مفاتيح API، وإعدادات المستخدم الشخصية.

هذا المقال يستعرض بصورة موسّعة ومفصلة كيفية إدارة الإعدادات في ‎.NET بمختلف إصداراته، وخاصة ‎.NET Core و‎.NET 5+، مروراً بمزايا ومخاطر كل آلية، مع تسليط الضوء على الأساليب الحديثة مثل appsettings.json وIConfiguration وOptions Pattern.


أهمية إدارة الإعدادات في التطبيقات البرمجية

تمثل الإعدادات وسيلة فعالة لفصل منطق البرنامج عن بيانات التكوين، وهو مبدأ تصميم يُعرف بـ “Separation of Concerns”. من خلال هذه الآلية يمكن لتطبيق واحد أن يعمل في بيئات مختلفة دون تعديل الشيفرة المصدرية، كما تتيح للمطورين:

  • التبديل السريع بين بيئات التطوير (Development)، الاختبار (Testing)، والإنتاج (Production).

  • تفعيل وتعطيل ميزات معينة دون المساس بالكود.

  • حماية معلومات حساسة من خلال فصلها عن ملفات الكود باستخدام أدوات مثل Secret Manager أو Azure Key Vault.


الطرق التقليدية: app.config وweb.config

في الإصدارات الأقدم من ‎.NET Framework، تُستخدم ملفات XML مثل app.config لتطبيقات سطح المكتب، وweb.config لتطبيقات الويب. تحتوي هذه الملفات على عقد XML مثل و، وتُستخدم بالشكل التالي:

xml
<configuration> <appSettings> <add key="ApiKey" value="1234567890abcdef" /> <add key="Theme" value="Dark" /> appSettings> <connectionStrings> <add name="MyDb" connectionString="Server=.;Database=TestDb;Trusted_Connection=True;" /> connectionStrings> configuration>

ويتم الوصول إليها من خلال:

csharp
string apiKey = ConfigurationManager.AppSettings["ApiKey"]; string connString = ConfigurationManager.ConnectionStrings["MyDb"].ConnectionString;

رغم فاعلية هذه الطريقة، إلا أنها تعاني من قيود عديدة مثل:

  • عدم دعم البنى الهرمية في الإعدادات.

  • صعوبة إدارة إعدادات متعددة البيئات.

  • ضعف التكامل مع أدوات DevOps الحديثة.


نموذج ‎.NET Core و‎.NET 5+: appsettings.json

مع ‎.NET Core والإصدارات الأحدث، تم إدخال نموذج جديد لإدارة الإعدادات يعتمد على ملفات JSON، مما قدّم مرونة هائلة ودعماً أقوى للتكوين الهرمي والمتعدد المستويات.

مثال على ملف appsettings.json:

json
{ "Logging": { "LogLevel": { "Default": "Warning", "Microsoft": "Information" } }, "ConnectionStrings": { "DefaultConnection": "Server=.;Database=TestDb;Trusted_Connection=True;" }, "AppSettings": { "ApiKey": "abcdef123456", "FeatureToggle": { "EnableFeatureX": true } } }

ويتم تحميل هذه الإعدادات خلال بدء تشغيل التطبيق باستخدام IConfiguration:

csharp
public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { var apiKey = Configuration["AppSettings:ApiKey"]; var enableFeatureX = Configuration.GetValue<bool>("AppSettings:FeatureToggle:EnableFeatureX"); } }

التكوين حسب البيئة Environment-Specific Configuration

توفر ‎.NET آلية مرنة للتمييز بين إعدادات بيئة التطوير والإنتاج والاختبار من خلال ملفات مثل:

  • appsettings.Development.json

  • appsettings.Production.json

يتم تحميل الملف المناسب تلقائيًا اعتمادًا على متغير البيئة ASPNETCORE_ENVIRONMENT.

الترتيب في تحميل الإعدادات يكون على النحو التالي:

  1. appsettings.json

  2. appsettings.{Environment}.json

  3. متغيرات البيئة Environment Variables

  4. سطر الأوامر Command-line arguments

  5. Secret Manager (في بيئة التطوير)


قراءة الإعدادات باستخدام واجهة IOptions

يُعد استخدام نمط الخيارات (Options Pattern) من الأساليب الشائعة لربط الأقسام في ملفات الإعدادات بكائنات C# strongly-typed، مما يزيد من أمان النوع والتنظيم.

تعريف الكلاس:

csharp
public class AppSettings { public string ApiKey { get; set; } public FeatureToggle FeatureToggle { get; set; } } public class FeatureToggle { public bool EnableFeatureX { get; set; } }

ربط الإعدادات بالخدمة:

csharp
public void ConfigureServices(IServiceCollection services) { services.Configure(Configuration.GetSection("AppSettings")); }

الاستخدام داخل الفئة:

csharp
public class SomeService { private readonly AppSettings _settings; public SomeService(IOptions options) { _settings = options.Value; } public void DoWork() { if (_settings.FeatureToggle.EnableFeatureX) { // تنفيذ ميزة X } } }

استخدام Secret Manager لحماية البيانات الحساسة

تُستخدم أداة Secret Manager في بيئة التطوير لحماية المعلومات الحساسة مثل كلمات المرور ومفاتيح API.

خطوات الاستخدام:

  1. إنشاء الملف السري:

bash
dotnet user-secrets init
  1. إضافة مفتاح:

bash
dotnet user-secrets set "AppSettings:ApiKey" "SuperSecretApiKey123"
  1. قراءة القيمة داخل التطبيق تلقائيًا عبر IConfiguration.


استخدام Azure Key Vault

عند نشر التطبيقات في بيئة Azure، يمكن استخدام Azure Key Vault لتخزين وإدارة البيانات الحساسة.

مزاياه:

  • تشفير البيانات.

  • التحكم في الوصول.

  • التكامل مع Azure Active Directory.

يتم ربط Key Vault بـ‎.NET عبر مكتبة Azure.Extensions.AspNetCore.Configuration.Secrets.


استخدام متغيرات البيئة وسطر الأوامر

يمكن استبدال أو تجاوز أي إعداد موجود في appsettings.json عبر متغيرات البيئة أو سطر الأوامر.

متغير البيئة:

bash
export AppSettings__ApiKey=OverriddenKey

سطر الأوامر:

bash
dotnet run --AppSettings:ApiKey=CmdLineKey

في هذا السياق، تُستخدم علامة : للفصل بين المستويات داخل JSON، وتُستبدل بـ__ عند تعريف متغيرات البيئة بسبب قيود الأسماء في بعض الأنظمة.


جدول مقارنة لطرق تحميل الإعدادات في ‎.NET

الوسيلة سهولة الاستخدام دعم التكوين الهرمي التبديل حسب البيئة الأمان
app.config / web.config عالية منخفضة محدود منخفض
appsettings.json عالية جداً عالية مدعوم متوسط
Secret Manager متوسطة مدعوم تطوير فقط عالي
Azure Key Vault متوسطة مدعوم مدعوم عالي جداً
متغيرات البيئة عالية مدعوم باستخدام “__” مدعوم متوسط
سطر الأوامر متقدمة مدعوم باستخدام “:” مدعوم منخفض

أفضل الممارسات لإدارة الإعدادات

  1. عدم تخزين القيم الحساسة في ملفات appsettings.json عند استخدام التحكم بالإصدار (Git).

  2. استخدام Azure Key Vault أو Secret Manager للبيانات السرية.

  3. استخدام أنماط قوية مثل Options Pattern لضمان أمن النوع وسهولة الصيانة.

  4. تحميل الإعدادات حسب البيئة لتوفير مرونة أكبر أثناء التطوير والاختبار والنشر.

  5. توثيق إعدادات التطبيق بشكل واضح لتجنب التعقيد وفقدان البنية.

  6. استخدام الأدوات التلقائية مثل Azure App Configuration للمشاريع الكبيرة متعددة الخدمات.


المصادر والمراجع