أعلام الميزات في C#: كيفية تفعيل الميزات دون إعادة النشر

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هي أعلام الميزات ولماذا تحتاجها

\n

تخيل: لقد كتبت ميزة جديدة رائعة - على سبيل المثال، بحث ذكي مع الإكمال التلقائي. كل شيء تم اختباره، والكود اجتاز المراجعة. لكنك لست متأكدًا بنسبة 100% أن المستخدمين سيقبلونها. أو تخشى أنها ستتعطل تحت الضغط. ماذا تفعل؟

\n

في السابق، كانت الإجابة بسيطة: "انشرها في الإنتاج وصلّ". اليوم نحن أكثر ذكاءً. نستخدم أعلام الميزات (feature flags, feature toggles) - آلية تسمح بتشغيل وإيقاف الوظائف بسرعة، دون إعادة ترجمة أو إعادة نشر.

\n

في هذه المقالة على PythonLib، سنشرح كيفية دمج أعلام الميزات في مشاريع C# - من أبسط تنفيذ إلى سيناريوهات متقدمة مع اختبار A/B والإصدارات التجريبية.

\n\n

لماذا أعلام الميزات ضرورية لمطور C#

\n

أعلام الميزات C# تحل ثلاث مهام رئيسية:

\n
    \n
  • النشر الآمن: انشر الكود في الإنتاج حتى لو كانت الميزة غير جاهزة بعد. فقط قم بإيقاف العلم.
  • \n
  • الإيقاف الفوري: حدث خطأ ما؟ نقرة واحدة في لوحة الإدارة - وتختفي الميزة الإشكالية.
  • \n
  • إدارة مرنة للوظائف: قم بتشغيل الميزات لمستخدمين محددين، مناطق، أو حسب الوقت.
  • \n
\n

والأفضل من ذلك: لـ إدارة الوظائف في .NET لا حاجة لاختراع العجلة - هناك مكتبة جاهزة Microsoft.FeatureManagement.

\n\n

أسهل طريقة: ملف التكوين

\n

لنبدأ بالنهج الأساسي - عبر appsettings.json. هذا مثالي لـ تبديل الميزات .NET البسيط.

\n\n

الخطوة 1. إضافة الإعدادات

\n
{\n  "FeatureManagement": {\n    "NewSearchEngine": true,\n    "DarkMode": false,\n    "BetaDashboard": true\n  }\n}
\n\n

الخطوة 2. تسجيل الخدمة

\n

في Program.cs أضف:

\n
builder.Services.AddFeatureManagement();
\n\n

الخطوة 3. الاستخدام في الكود

\n
public class SearchController\n{\n    private readonly IFeatureManager _featureManager;\n\n    public SearchController(IFeatureManager featureManager)\n    {\n        _featureManager = featureManager;\n    }\n\n    public async Task<IActionResult> Search(string query)\n    {\n        if (await _featureManager.IsEnabledAsync("NewSearchEngine"))\n        {\n            return View("NewSearch", await _newEngine.SearchAsync(query));\n        }\n        return View("LegacySearch", await _oldEngine.SearchAsync(query));\n    }\n}
\n

تم! الآن، لتشغيل الميزة الجديدة، يكفي تغيير true إلى false في ملف التكوين وإعادة تشغيل التطبيق. لكننا نريد بدون إعادة تشغيل؟

\n\n

أعلام الميزات الديناميكية: التبديل دون إعادة تشغيل

\n

لـ الميزات الشرطية C# دون إعادة تحميل، نستخدم موفري التكوين الذين يقومون بتحميل التغييرات. الخيار الأفضل هو قاعدة البيانات أو Redis.

\n\n

إنشاء موفر من قاعدة البيانات

\n
public class DatabaseFeatureDefinitionProvider : IFeatureDefinitionProvider\n{\n    private readonly AppDbContext _db;\n\n    public DatabaseFeatureDefinitionProvider(AppDbContext db)\n    {\n        _db = db;\n    }\n\n    public async Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName)\n    {\n        var feature = await _db.FeatureFlags\n            .FirstOrDefaultAsync(f => f.Name == featureName);\n        \n        return feature != null \n            ? new FeatureDefinition { Name = feature.Name, EnabledFor = feature.EnabledFor }\n            : null;\n    }\n\n    public IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync()\n    {\n        return _db.FeatureFlags\n            .Select(f => new FeatureDefinition { Name = f.Name, EnabledFor = f.EnabledFor })\n            .AsAsyncEnumerable();\n    }\n}
\n\n

التسجيل:

\n
builder.Services.AddFeatureManagement                

المدونات

توصيات الكتب