.NET Feature Management

Microsoft.FeatureManagement
Microsoft.FeatureManagement.AspNetCore

Microsoft.FeatureManagement
Microsoft.FeatureManagement.AspNetCore
Microsoft.FeatureManagement.Telemetry.ApplicationInsights
Microsoft.FeatureManagement.Telemetry.ApplicationInsights.AspNetCore

توفر مكتبة إدارة ميزات .NET طريقة لتطوير وظائف التطبيق وعرضها استنادا إلى علامات الميزات. بمجرد تطوير ميزة جديدة، يكون للعديد من التطبيقات متطلبات خاصة، مثل متى يجب تمكين الميزة وتحت أي شروط. توفر هذه المكتبة طريقة لتعريف هذه العلاقات، كما تتكامل مع أنماط التعليمات البرمجية .NET الشائعة لجعل الكشف عن هذه الميزات ممكنا.

توفر علامات الميزات طريقة لتطبيقات .NET و ASP.NET Core لتشغيل الميزات أو إيقاف تشغيلها ديناميكيا. يمكن للمطورين استخدام علامات الميزات في حالات الاستخدام البسيطة مثل العبارات الشرطية إلى سيناريوهات أكثر تقدما مثل إضافة المسارات أو عوامل تصفية MVC بشكل مشروط. تم إنشاء علامات الميزات أعلى نظام تكوين .NET Core. أي موفر تكوين .NET Core قادر على العمل كركيزة أساسية لعلامات الميزات.

فيما يلي بعض فوائد استخدام مكتبة إدارة ميزات .NET:

  • اصطلاح مشترك لإدارة الميزات

  • حاجز منخفض أمام الدخول

    • مبني على IConfiguration
    • يدعم إعداد علامة ميزة ملف JSON
  • إدارة مدة بقاء علامة الميزة

    • يمكن أن تتغير قيم التكوين في الوقت الفعلي؛ يمكن أن تكون علامات الميزة متناسقة عبر الطلب بأكمله
  • السيناريوهات البسيطة والمعقدة التي تمت تغطيتها

    • تبديل ميزات التشغيل/إيقاف التشغيل من خلال ملف التكوين التعريفي
    • تقييم حالة الميزة ديناميكيا استنادا إلى استدعاء الخادم
  • ملحقات واجهة برمجة التطبيقات لإطار عمل ASP.NET Core وMVC

    • التوجيه
    • عوامل التصفية
    • سمات الإجراء

    مكتبة إدارة ميزات .NET مصدر مفتوح. لمزيد من المعلومات، تفضل بزيارة مستودع GitHub.

علامات الميزة

تتكون علامات الميزات من جزأين، اسم وقائمة عوامل تصفية الميزات المستخدمة لتشغيل الميزة.

عوامل تصفية الميزات

تحدد عوامل تصفية الميزات سيناريو لمتى يجب تمكين ميزة. عند تقييم ميزة ما سواء كانت قيد التشغيل أو إيقاف التشغيل، يتم اجتياز قائمة عوامل تصفية الميزات الخاصة بها حتى تقرر إحدى عوامل التصفية أنه يجب تمكين الميزة. عند هذه النقطة، تعتبر الميزة ممكنة ويتوقف اجتيازها من خلال عوامل تصفية الميزة. إذا لم يشير أي عامل تصفية للميزة إلى أنه يجب تمكين الميزة، اعتبارها معطلة.

على سبيل المثال، يمكن تصميم عامل تصفية ميزة مستعرض Microsoft Edge. سيقوم عامل تصفية الميزة هذا بتنشيط أي ميزات يتم إرفاقها به طالما أن طلب HTTP قادم من Microsoft Edge.

تكوين علامة الميزة

يتم استخدام نظام تكوين .NET Core لتحديد حالة علامات الميزات. أساس هذا النظام هو IConfiguration. يمكن استخدام أي موفر لموفر IConfiguration حالة الميزة لمكتبة علامة الميزة. يتيح هذا النظام سيناريوهات تتراوح من appsettings.json إلى تكوين تطبيق Azure والمزيد.

إعلان علامة الميزة

تدعم مكتبة إدارة الميزات appsettings.json كمصدر علامة ميزة لأنها موفر لنظام .NET Core IConfiguration . فيما يلي مثال على التنسيق المستخدم لإعداد علامات الميزات في ملف json.

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },

    // Define feature flags in a json file
    "FeatureManagement": {
        "FeatureT": {
            "EnabledFor": [
                {
                    "Name": "AlwaysOn"
                }
            ]
        },
        "FeatureU": {
            "EnabledFor": []
        },
        "FeatureV": {
            "EnabledFor": [
                {
                    "Name": "TimeWindow",
                    "Parameters": {
                        "Start": "Wed, 01 May 2019 13:59:59 GMT",
                        "End": "Mon, 01 Jul 2019 00:00:00 GMT"
                    }
                }
            ]
        }
    }
}

FeatureManagement يتم استخدام قسم من مستند json بواسطة الاصطلاح لتحميل إعدادات علامة الميزة. في القسم أعلاه، نرى ثلاث ميزات مختلفة. تحدد الميزات عوامل تصفية الميزات الخاصة بها باستخدام الخاصية EnabledFor . في عوامل تصفية الميزات ل FeatureT، نرى AlwaysOn. عامل تصفية الميزة هذا مضمن وإذا تم تحديده فسيمكن الميزة دائما. AlwaysOn لا يتطلب عامل تصفية الميزة أي تكوين، لذلك يحتوي على الخاصية Name فقط. FeatureU ليس لديه عوامل تصفية في الخاصية الخاصة به EnabledFor وبالتالي لن يتم تمكينه أبدا. لن يمكن الوصول إلى أي وظيفة تعتمد على هذه الميزة التي يتم تمكينها طالما ظلت عوامل تصفية الميزة فارغة. ومع ذلك، بمجرد إضافة عامل تصفية ميزة يمكن الميزة من بدء العمل. FeatureV يحدد عامل تصفية ميزة يسمى TimeWindow. هذا مثال على عامل تصفية ميزة قابل للتكوين. يمكننا أن نرى في المثال أن عامل التصفية يحتوي على خاصية Parameters . يتم استخدام هذا لتكوين عامل التصفية. في هذه الحالة، يتم تكوين أوقات البدء والانتهاء للميزة لتكون نشطة.

يمكن العثور على المخطط التفصيلي للمقطع FeatureManagement هنا.

خيارات متقدمة: يحظر استخدام النقطين ':' في أسماء علامات الميزة.

إعلان التشغيل/إيقاف التشغيل

توضح القصاصة البرمجية التالية طريقة بديلة لتعريف ميزة يمكن استخدامها لميزات التشغيل/إيقاف التشغيل.

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },

    // Define feature flags in config file
    "FeatureManagement": {
        "FeatureT": true, // On feature
        "FeatureX": false // Off feature
    }
}

نوع المتطلبات

RequirementType يتم استخدام خاصية علامة الميزة لتحديد ما إذا كان يجب استخدام Any عوامل التصفية أو All المنطق عند تقييم حالة الميزة. إذا RequirementType لم يتم تحديد، فإن القيمة الافتراضية هي Any.

  • Any يعني أن عامل تصفية واحدا فقط يحتاج إلى التقييم إلى true حتى يتم تمكين الميزة.
  • All يعني أن كل عامل تصفية يحتاج إلى تقييم إلى صحيح لتمكين الميزة.

A RequirementType من All التغييرات التي يتم اجتيازها. أولا، إذا لم تكن هناك عوامل تصفية، يتم تعطيل الميزة. بعد ذلك، يتم اجتياز عوامل تصفية الميزة حتى تقرر إحدى عوامل التصفية أنه يجب تعطيل الميزة. إذا لم يشير أي عامل تصفية إلى أنه يجب تعطيل الميزة، اعتبارها ممكنة.

"FeatureW": {
    "RequirementType": "All",
    "EnabledFor": [
        {
            "Name": "TimeWindow",
            "Parameters": {
                "Start": "Mon, 01 May 2023 13:59:59 GMT",
                "End": "Sat, 01 Jul 2023 00:00:00 GMT"
            }
        },
        {
            "Name": "Percentage",
            "Parameters": {
                "Value": "50"
            }
        }
    ]
}

في المثال أعلاه، FeatureW يحدد من RequirementType All، مما يعني أنه يجب تقييم جميع عوامل التصفية الخاصة به إلى true حتى يتم تمكين الميزة. في هذه الحالة، يتم تمكين الميزة ل 50٪ من المستخدمين خلال النافذة الزمنية المحددة.

مخطط Microsoft Feature Management

تدعم مكتبة إدارة الميزات أيضا استخدام Microsoft Feature Management schema لتعريف علامات الميزات. هذا المخطط غير محدد اللغة في الأصل وهو مدعوم من قبل جميع مكتبات إدارة ميزات Microsoft.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "FeatureT",
                "enabled": true,
                "conditions": {
                    "client_filters": [
                        {  
                            "name": "Microsoft.TimeWindow",
                            "parameters": {
                                "Start": "Mon, 01 May 2023 13:59:59 GMT",
                                "End": "Sat, 01 Jul 2023 00:00:00 GMT"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

إشعار

إذا كان يمكن العثور على feature_management المقطع في التكوين، FeatureManagement يتم تجاهل المقطع.

تدعم مكتبة إدارة الميزات appsettings.json كمصدر علامة ميزة لأنها موفر لنظام .NET Core IConfiguration . يتم الإعلان عن علامات الميزات باستخدام Microsoft Feature Management schema. هذا المخطط غير محدد اللغة في الأصل وهو مدعوم من قبل جميع مكتبات إدارة ميزات Microsoft.

فيما يلي مثال على الإعلان عن علامات الميزة في ملف json.

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },

    // Define feature flags in a json file
    "feature_management": {
        "feature_flags": [
            {
                "id": "FeatureT",
                "enabled": false
            },
            {
                "id": "FeatureU",
                "enabled": true,
                "conditions": {}
            },
            {
                "id": "FeatureV",
                "enabled": true,
                "conditions": {
                    "client_filters": [
                        {  
                            "name": "Microsoft.TimeWindow",
                            "parameters": {
                                "Start": "Mon, 01 May 2023 13:59:59 GMT",
                                "End": "Sat, 01 July 2023 00:00:00 GMT"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

feature_management يتم استخدام قسم من مستند json بواسطة الاصطلاح لتحميل إعدادات علامة الميزة. يجب إدراج كائنات علامة الميزة في feature_flags الصفيف ضمن feature_management القسم . في القسم أعلاه، نرى أننا قدمنا ثلاث ميزات مختلفة. تحتوي علامة الميزة على id خصائص و enabled . id هو الاسم المستخدم لتعريف علامة الميزة والإشارة إليها. enabled تحدد الخاصية الحالة الممكنة لعلامة الميزة. تكون الميزة متوقفة عن التشغيل إذا كانت enabled خاطئة. إذا كان enabled صحيحا، فإن حالة الميزة تعتمد على conditions. إذا لم يكن conditions هناك عندئذ تكون الميزة قيد التشغيل. إذا كان هناك conditions وتم الوفاء بها، فإن الميزة قيد التشغيل. إذا كان هناك conditions ولم يتم الوفاء بها، فإن الميزة متوقفة عن التشغيل. conditions تعلن الخاصية الشروط المستخدمة لتمكين الميزة ديناميكيا. تحدد الميزات عوامل تصفية الميزات الخاصة بها في client_filters الصفيف. FeatureV يحدد عامل تصفية ميزة يسمى Microsoft.TimeWindow. هذا مثال على عامل تصفية ميزة قابل للتكوين. يمكننا أن نرى في المثال أن عامل التصفية يحتوي على خاصية Parameters . يتم استخدام هذا لتكوين عامل التصفية. في هذه الحالة، يتم تكوين أوقات البدء والانتهاء للميزة لتكون نشطة.

خيارات متقدمة: يحظر استخدام النقطين ':' في أسماء علامات الميزة.

نوع المتطلبات

requirement_type يتم استخدام خاصية conditions لتحديد ما إذا كان يجب استخدام Any عوامل التصفية أو All المنطق عند تقييم حالة الميزة. إذا requirement_type لم يتم تحديد، فإن القيمة الافتراضية هي Any.

  • Any يعني أن عامل تصفية واحدا فقط يحتاج إلى التقييم إلى true حتى يتم تمكين الميزة.
  • All يعني أن كل عامل تصفية يحتاج إلى تقييم إلى صحيح لتمكين الميزة.

A requirement_type من All التغييرات التي يتم اجتيازها. أولا، إذا لم يكن هناك عامل تصفية، تعطيل الميزة. إذا كانت هناك عوامل تصفية، اجتياز عوامل تصفية الميزة حتى تقرر إحدى عوامل التصفية أنه يجب تعطيل الميزة. إذا لم يشير أي عامل تصفية إلى أنه يجب تعطيل الميزة، اعتبارها ممكنة.

{
    "id": "FeatureW",
    "enabled": true,
    "conditions": {
        "requirement_type": "All",
        "client_filters": [
            {
                "name": "Microsoft.TimeWindow",
                "parameters": {
                    "Start": "Mon, 01 May 2023 13:59:59 GMT",
                    "End": "Sat, 01 Jul 2023 00:00:00 GMT"
                }
            },
            {
                "name": "Microsoft.Percentage",
                "parameters": {
                    "Value": "50"
                }
            }
        ]
    }
}

في المثال أعلاه، FeatureW يحدد من requirement_type All، مما يعني أنه يجب تقييم جميع عوامل التصفية الخاصة به إلى true حتى يتم تمكين الميزة. في هذه الحالة، سيتم تمكين الميزة ل 50٪ من المستخدمين خلال النافذة الزمنية المحددة.

مخطط .NET Feature Management

في الإصدارات السابقة، كان المخطط الأساسي لمكتبة إدارة الميزات هو .NET feature management schema. بدءا من الإصدار 4.0.0، لن يتم دعم الميزات الجديدة بما في ذلك المتغيرات وبيانات تتبع الاستخدام لمخطط إدارة ميزات .NET.

إشعار

إذا كان هناك إعلان علامة ميزة يمكن العثور عليه في كل feature_management من المقطعين و FeatureManagement ، اعتماد الإعلان من feature_management القسم.

الاستهلاك‬

الشكل الأساسي لإدارة الميزات هو التحقق مما إذا تم تمكين علامة ميزة ثم تنفيذ الإجراءات استنادا إلى النتيجة. يتم ذلك من خلال IFeatureManagerأسلوب .IsEnabledAsync

…
IFeatureManager featureManager;
…
if (await featureManager.IsEnabledAsync("FeatureX"))
{
    // Do something
}

تسجيل الخدمة

تعتمد إدارة الميزات على إدخال تبعية .NET Core. يمكننا تسجيل خدمات إدارة الميزات باستخدام الاصطلاحات القياسية.

using Microsoft.FeatureManagement;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddFeatureManagement();
    }
}

بشكل افتراضي، يسترد مدير الميزات تكوين علامة الميزة من قسم "FeatureManagement" في بيانات تكوين .NET Core. إذا لم يكن قسم "FeatureManagement" موجودا، يعتبر التكوين فارغا.

إشعار

يمكنك أيضا تحديد أنه يجب استرداد تكوين علامة الميزة من قسم تكوين مختلف عن طريق تمرير المقطع إلى AddFeatureManagement. يوضح المثال التالي لمدير الميزات القراءة من قسم مختلف يسمى "MyFeatureFlags" بدلا من ذلك:

services.AddFeatureManagement(configuration.GetSection("MyFeatureFlags"));

حقن التبعية

عند استخدام مكتبة إدارة الميزات مع MVC، IFeatureManager يمكن الحصول على من خلال إدخال التبعية.

public class HomeController : Controller
{
    private readonly IFeatureManager _featureManager;
    
    public HomeController(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }
}

خدمات إدارة الميزات محددة النطاق

AddFeatureManagement يضيف الأسلوب خدمات إدارة الميزات كقاعدة بيانات أحادية داخل التطبيق، ولكن هناك سيناريوهات قد يكون من الضروري فيها إضافة خدمات إدارة الميزات كخدمات محددة النطاق بدلا من ذلك. على سبيل المثال، قد يرغب المستخدمون في استخدام عوامل تصفية الميزات التي تستهلك خدمات محددة النطاق لمعلومات السياق. في هذه الحالة، AddScopedFeatureManagement يجب استخدام الأسلوب بدلا من ذلك. وهذا يضمن إضافة خدمات إدارة الميزات، بما في ذلك عوامل تصفية الميزات، كخدمات محددة النطاق.

services.AddScopedFeatureManagement();

ASP.NET التكامل الأساسي

توفر مكتبة إدارة الميزات وظائف في ASP.NET Core وMVC لتمكين سيناريوهات علامة الميزة الشائعة في تطبيقات الويب. تتوفر هذه الإمكانات عن طريق الرجوع إلى حزمة Microsoft.FeatureManagement.AspNetCore NuGet.

وحدات التحكم والإجراءات

يمكن أن تتطلب وحدة تحكم MVC والإجراءات تمكين ميزة معينة، أو إحدى أي قائمة من الميزات، من أجل التنفيذ. يمكن القيام بذلك باستخدام FeatureGateAttribute، والذي يمكن العثور عليه في Microsoft.FeatureManagement.Mvc مساحة الاسم.

[FeatureGate("FeatureX")]
public class HomeController : Controller
{
    …
}

يتم HomeController بوابات أعلاه بواسطة "FeatureX". يجب تمكين "FeatureX" قبل تنفيذ أي إجراء HomeController يحتوي عليه.

[FeatureGate("FeatureX")]
public IActionResult Index()
{
    return View();
}

Index يتطلب إجراء MVC أعلاه تمكين "FeatureX" قبل أن يمكن تنفيذه.

معالجة الإجراءات المعطلة

عند حظر وحدة تحكم MVC أو إجراء بسبب عدم تمكين أي من الميزات التي تحددها، سيتم استدعاء مسجل IDisabledFeaturesHandler . بشكل افتراضي، يتم تسجيل معالج الحد الأدنى الذي يقوم بإرجاع HTTP 404. يمكن تجاوز هذا باستخدام IFeatureManagementBuilder عند تسجيل علامات الميزة.

public interface IDisabledFeaturesHandler
{
    Task HandleDisabledFeature(IEnumerable<string> features, ActionExecutingContext context);
}

العرض

في طرق عرض <feature> MVC، يمكن استخدام علامات لعرض المحتوى بشكل مشروط استنادا إلى ما إذا كانت الميزة ممكنة أم لا.

<feature name="FeatureX">
  <p>This can only be seen if 'FeatureX' is enabled.</p>
</feature>

يمكنك أيضا رفض تقييم مساعد العلامة لعرض المحتوى عند تعطيل ميزة أو مجموعة من الميزات. من خلال الإعداد negate="true" في المثال أدناه، يتم عرض المحتوى فقط إذا FeatureX تم تعطيله.

<feature negate="true" name="FeatureX">
  <p>This can only be seen if 'FeatureX' is disabled.</p>
</feature>

<feature> يمكن أن تشير العلامة إلى ميزات متعددة عن طريق تحديد قائمة مفصولة بفواصل من الميزات في السمة name .

<feature name="FeatureX,FeatureY">
  <p>This can only be seen if 'FeatureX' and 'FeatureY' are enabled.</p>
</feature>

بشكل افتراضي، يجب تمكين جميع الميزات المدرجة لعرض علامة الميزة. يمكن تجاوز هذا السلوك عن طريق إضافة السمة requirement كما هو موضح في المثال أدناه.

<feature name="FeatureX,FeatureY" requirement="Any">
  <p>This can only be seen if either 'FeatureX' or 'FeatureY' or both are enabled.</p>
</feature>

في طرق عرض <feature> MVC يمكن استخدام علامات لعرض المحتوى بشكل مشروط استنادا إلى ما إذا كان يتم تمكين ميزة أو ما إذا تم تعيين متغير معين من الميزة. لمزيد من المعلومات، راجع قسم المتغيرات .

<feature name="FeatureX">
  <p>This can only be seen if 'FeatureX' is enabled.</p>
</feature>
<feature name="FeatureX" variant="Alpha">
  <p>This can only be seen if variant 'Alpha' of 'FeatureX' is assigned.</p>
</feature>

يمكنك أيضا رفض تقييم مساعد العلامة لعرض المحتوى عند تعطيل ميزة أو مجموعة من الميزات. من خلال الإعداد negate="true" في المثال أدناه، يتم عرض المحتوى فقط إذا FeatureX تم تعطيله.

<feature negate="true" name="FeatureX">
  <p>This can only be seen if 'FeatureX' is disabled.</p>
</feature>
<feature negate="true" name="FeatureX" variant="Alpha">
  <p>This can only be seen if variant 'Alpha' of 'FeatureX' isn't assigned.</p>
</feature>

<feature> يمكن أن تشير العلامة إلى ميزات/متغيرات متعددة عن طريق تحديد قائمة مفصولة بفواصل من الميزات/المتغيرات في السمة/namevariant.

<feature name="FeatureX,FeatureY">
  <p>This can only be seen if 'FeatureX' and 'FeatureY' are enabled.</p>
</feature>
<feature name="FeatureX" variant="Alpha,Beta">
  <p>This can only be seen if variant 'Alpha' or 'Beta' of 'FeatureX' is assigned.</p>
</feature>

إشعار

إذا variant تم تحديد، يجب تحديد ميزة واحدة فقط.

بشكل افتراضي، يجب تمكين جميع الميزات المدرجة لعرض علامة الميزة. يمكن تجاوز هذا السلوك عن طريق إضافة السمة requirement كما هو موضح في المثال أدناه.

إشعار

إذا تم استخدام بالتزامن requirement And مع variant خطأ سيتم طرحه، حيث لا يمكن تعيين متغيرات متعددة أبدا.

<feature name="FeatureX,FeatureY" requirement="Any">
  <p>This can only be seen if either 'FeatureX' or 'FeatureY' or both are enabled.</p>
</feature>

<feature> تتطلب العلامة أن يعمل مساعد العلامة. يمكن القيام بذلك عن طريق إضافة مساعد علامة إدارة الميزات إلى ملف ViewImports.cshtml .

@addTagHelper *, Microsoft.FeatureManagement.AspNetCore

عوامل تصفية MVC

يمكن إعداد عوامل تصفية إجراءات MVC للتنفيذ الشرطي استنادا إلى حالة الميزة. يتم ذلك عن طريق تسجيل عوامل تصفية MVC بطريقة مدركة للميزة. يدعم مسار إدارة الميزات عوامل تصفية إجراء MVC غير المتزامنة، والتي تنفذ IAsyncActionFilter.

services.AddMvc(o => 
{
    o.Filters.AddForFeature<SomeMvcFilter>("FeatureX");
});

تضيف التعليمات البرمجية أعلاه عامل تصفية MVC المسمى SomeMvcFilter. يتم تشغيل عامل التصفية هذا فقط داخل البنية الأساسية لبرنامج ربط العمليات التجارية MVC إذا تم تمكين "FeatureX".

صفحات Razor

يمكن أن تتطلب صفحات MVC Razor تمكين ميزة معينة، أو إحدى أي قائمة من الميزات، من أجل التنفيذ. يمكن القيام بذلك باستخدام FeatureGateAttribute، والذي يمكن العثور عليه في Microsoft.FeatureManagement.Mvc مساحة الاسم.

[FeatureGate("FeatureX")]
public class IndexModel : PageModel
{
    public void OnGet()
    {
    }
}

يقوم الرمز أعلاه بإعداد صفحة Razor لطلب تمكين "FeatureX". إذا لم يتم تمكين الميزة، تنشئ الصفحة نتيجة HTTP 404 (NotFound).

عند استخدامه على صفحات Razor، FeatureGateAttribute يجب وضع على نوع معالج الصفحة. لا يمكن وضعه على أساليب المعالج الفردية.

بناء التطبيق

يمكن استخدام مكتبة إدارة الميزات لإضافة فروع التطبيقات والبرامج الوسيطة التي تنفذ بشكل مشروط استنادا إلى حالة الميزة.

app.UseMiddlewareForFeature<ThirdPartyMiddleware>("FeatureX");

مع الاستدعاء أعلاه، يضيف التطبيق مكون برنامج وسيط يظهر فقط في مسار الطلب إذا تم تمكين الميزة "FeatureX". إذا تم تمكين/تعطيل الميزة أثناء وقت التشغيل، يمكن تغيير البنية الأساسية لبرنامج ربط العمليات التجارية للبرامج الوسيطة ديناميكيا.

يؤدي هذا إلى إنشاء إمكانية أكثر عمومية لتشعب التطبيق بأكمله استنادا إلى ميزة.

app.UseForFeature(featureName, appBuilder => 
{
    appBuilder.UseMiddleware<T>();
});

تنفيذ عامل تصفية الميزات

يوفر إنشاء عامل تصفية ميزات طريقة لتمكين الميزات استنادا إلى المعايير التي تحددها. لتنفيذ عامل تصفية ميزة، يجب تنفيذ الواجهة IFeatureFilter . IFeatureFilter لديه أسلوب واحد يسمى EvaluateAsync. عندما تحدد ميزة أنه يمكن تمكينها لعامل تصفية ميزة، EvaluateAsync يتم استدعاء الأسلوب . إذا تم EvaluateAsync إرجاع true، فهذا يعني أنه يجب تمكين الميزة.

توضح القصاصة البرمجية التالية كيفية إضافة عامل تصفية MyCriteriaFilterميزة مخصص .

services.AddFeatureManagement()
        .AddFeatureFilter<MyCriteriaFilter>();

يتم تسجيل عوامل تصفية الميزات عن طريق استدعاء AddFeatureFilter<T> على الذي IFeatureManagementBuilder تم إرجاعه من AddFeatureManagement. تتمتع عوامل تصفية الميزات هذه بالوصول إلى الخدمات الموجودة ضمن مجموعة الخدمة التي تم استخدامها لإضافة علامات الميزات. يمكن استخدام إدخال التبعية لاسترداد هذه الخدمات.

إشعار

عند الإشارة إلى عوامل التصفية في إعدادات علامة الميزة (على سبيل المثال، appsettings.json)، يجب حذف جزء عامل التصفية من اسم النوع. لمزيد من المعلومات، راجع Filter Alias Attribute القسم .

عوامل تصفية الميزات ذات المعلمات

تتطلب بعض عوامل تصفية الميزات معلمات لتحديد ما إذا كان يجب تشغيل ميزة أم لا. على سبيل المثال، قد يقوم عامل تصفية ميزة المستعرض بتشغيل ميزة لمجموعة معينة من المستعرضات. قد يكون من المرغوب فيه أن تقوم مستعرضات Edge وChrome بتمكين ميزة، بينما لا يقوم Firefox بذلك. للقيام بذلك، يمكن تصميم عامل تصفية ميزة لتوقع المعلمات. سيتم تحديد هذه المعلمات في تكوين الميزة، وفي التعليمات البرمجية يمكن الوصول إليها عبر معلمة FeatureFilterEvaluationContext IFeatureFilter.EvaluateAsync.

public class FeatureFilterEvaluationContext
{
    /// <summary>
    /// The name of the feature being evaluated.
    /// </summary>
    public string FeatureName { get; set; }

    /// <summary>
    /// The settings provided for the feature filter to use when evaluating whether the feature should be enabled.
    /// </summary>
    public IConfiguration Parameters { get; set; }
}

FeatureFilterEvaluationContext لديه خاصية تسمى Parameters. تمثل هذه المعلمات تكوينا أوليا يمكن لعامل تصفية الميزة استخدامه لتحديد كيفية تقييم ما إذا كان يجب تمكين الميزة أم لا. لاستخدام عامل تصفية ميزة المستعرض كمثال مرة أخرى، يمكن استخدام Parameters عامل التصفية لاستخراج مجموعة من المستعرضات المسموح بها التي سيتم تحديدها للميزة ثم التحقق مما إذا كان يتم إرسال الطلب من أحد هذه المستعرضات.

[FilterAlias("Browser")]
public class BrowserFilter : IFeatureFilter
{
    …

    public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context)
    {
        BrowserFilterSettings settings = context.Parameters.Get<BrowserFilterSettings>() ?? new BrowserFilterSettings();

        //
        // Here we would use the settings and see if the request was sent from any of BrowserFilterSettings.AllowedBrowsers
    }
}

سمة الاسم المستعار للتصفية

عند تسجيل عامل تصفية ميزة لعلامة ميزة، يكون الاسم المستعار المستخدم في التكوين هو اسم نوع عامل تصفية الميزة مع إزالة لاحقة عامل التصفية، إن وجدت. على سبيل المثال، MyCriteriaFilter يشار إليه باسم MyCriteria في التكوين.

"MyFeature": {
    "EnabledFor": [
        {
            "Name": "MyCriteria"
        }
    ]
}

يمكن تجاوز هذا باستخدام FilterAliasAttribute. يمكن تزيين عامل تصفية ميزة بهذه السمة للإعلان عن الاسم الذي يجب استخدامه في التكوين للإشارة إلى عامل تصفية الميزة هذا ضمن علامة ميزة.

عوامل تصفية الميزات المفقودة

إذا تم تكوين ميزة ليتم تمكينها لعامل تصفية ميزة معين ولم يتم تسجيل عامل تصفية الميزة هذا، يتم طرح استثناء عند تقييم الميزة. يمكن تعطيل الاستثناء باستخدام خيارات إدارة الميزات.

services.Configure<FeatureManagementOptions>(options =>
{
    options.IgnoreMissingFeatureFilters = true;
});

استخدام HttpContext

يمكن لعوامل تصفية الميزات تقييم ما إذا كان يجب تمكين ميزة استنادا إلى خصائص طلب HTTP. يتم تنفيذ ذلك عن طريق فحص سياق HTTP. يمكن لعامل تصفية الميزة الحصول على مرجع إلى سياق HTTP عن طريق الحصول على IHttpContextAccessor من خلال إدخال التبعية.

public class BrowserFilter : IFeatureFilter
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public BrowserFilter(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
    }
}

IHttpContextAccessor يجب إضافة إلى حاوية إدخال التبعية عند بدء التشغيل حتى تكون متوفرة. يمكن تسجيله في IServiceCollection باستخدام الأسلوب التالي.

public void ConfigureServices(IServiceCollection services)
{
    …
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    …
}

خيارات متقدمة: IHttpContextAccessor/HttpContext لا ينبغي استخدامها في مكونات Razor لتطبيقات Blazor من جانب الخادم. النهج الموصى به لتمرير سياق http في تطبيقات Blazor هو نسخ البيانات إلى خدمة محددة النطاق. بالنسبة لتطبيقات Blazor، AddScopedFeatureManagement يجب استخدامها لتسجيل خدمات إدارة الميزات. لمزيد من المعلومات، راجع Scoped Feature Management Services القسم .

توفير سياق لتقييم الميزات

في تطبيقات وحدة التحكم، لا يوجد سياق محيط مثل HttpContext أن عوامل تصفية الميزات يمكن الحصول عليها واستخدامها للتحقق مما إذا كان يجب تشغيل الميزة أو إيقاف تشغيلها. في هذه الحالة، تحتاج التطبيقات إلى توفير عنصر يمثل سياقا في نظام إدارة الميزات للاستخدام بواسطة عوامل تصفية الميزات. يتم ذلك باستخدام IFeatureManager.IsEnabledAsync<TContext>(string featureName, TContext appContext). يمكن استخدام كائن appContext الذي يتم توفيره لمدير الميزات بواسطة عوامل تصفية الميزات لتقييم حالة الميزة.

MyAppContext context = new MyAppContext
{
    AccountId = current.Id;
}

if (await featureManager.IsEnabledAsync(feature, context))
{
…
}

عوامل تصفية الميزة السياقية

تقوم عوامل تصفية الميزة السياقية بتنفيذ الواجهة IContextualFeatureFilter<TContext> . يمكن أن تستفيد عوامل تصفية الميزات الخاصة هذه من السياق الذي يتم تمريره عند IFeatureManager.IsEnabledAsync<TContext> استدعاء. TContext تصف معلمة النوع في IContextualFeatureFilter<TContext> نوع السياق الذي يمكن لعامل التصفية معالجته. يسمح هذا لمطور عامل تصفية الميزة السياقية بوصف ما هو مطلوب لأولئك الذين يرغبون في استخدامه. نظرا لأن كل نوع هو تابع للكائن، يمكن استدعاء عامل تصفية ينفذ IContextualFeatureFilter<object> لأي سياق متوفر. لتوضيح مثال لعامل تصفية ميزة سياقية أكثر تحديدا، ضع في اعتبارك ميزة تم تمكينها إذا كان الحساب في قائمة مكونة من الحسابات الممكنة.

public interface IAccountContext
{
    string AccountId { get; set; }
}

[FilterAlias("AccountId")]
class AccountIdFilter : IContextualFeatureFilter<IAccountContext>
{
    public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext featureEvaluationContext, IAccountContext accountId)
    {
        //
        // Evaluate if the feature should be on with the help of the provided IAccountContext
    }
}

يمكننا أن نرى أن AccountIdFilter يتطلب كائنا ينفذ IAccountContext ليتم توفيره ليكون قادرا على تقييم حالة الميزة. عند استخدام عامل تصفية الميزة هذا، يحتاج المتصل إلى التأكد من أن الكائن الذي تم تمريره IAccountContextينفذ .

إشعار

يمكن تنفيذ واجهة عامل تصفية ميزة واحدة فقط بواسطة نوع واحد. محاولة إضافة عامل تصفية ميزة ينفذ أكثر من واجهة عامل تصفية ميزة واحدة يؤدي إلى ArgumentException.

استخدام عوامل تصفية سياقية وغير سياقية بنفس الاسم المستعار

يمكن أن تشارك عوامل تصفية IFeatureFilter و IContextualFeatureFilter نفس الاسم المستعار. على وجه التحديد، يمكن أن يكون لديك اسم مستعار لعامل تصفية واحد مشترك بواسطة 0 أو 1 IFeatureFilter و0 أو N IContextualFeatureFilter<ContextType>، طالما أن هناك عامل تصفية قابل للتطبيق على الأكثر ل ContextType.

يصف المقطع التالي عملية تحديد عامل تصفية عند تسجيل عوامل تصفية سياقية وغير سياقية بنفس الاسم في أحد التطبيقات.

لنفترض أن لديك عامل تصفية غير سياقي يسمى FilterA واثنين من عوامل التصفية FilterB السياقية و FilterC التي تقبل TypeB TypeC والسياقات على التوالي. تشترك عوامل التصفية الثلاثة في الاسم المستعار SharedFilterNameنفسه .

لديك أيضا علامة MyFeature ميزة تستخدم عامل تصفية SharedFilterName الميزة في تكوينها.

إذا تم تسجيل جميع عوامل التصفية الثلاثة:

  • عند استدعاء IsEnabledAsync("MyFeature")، FilterA يتم استخدام لتقييم علامة الميزة.
  • عند استدعاء IsEnabledAsync("MyFeature"، السياق)، إذا كان نوع السياق هو TypeB، FilterB يتم استخدامه. إذا كان نوع السياق هو TypeC، FilterC يتم استخدامه.
  • عند استدعاء IsEnabledAsync("MyFeature"، السياق)، إذا كان نوع السياق هو TypeF، FilterA يتم استخدامه.

عوامل تصفية الميزات المضمنة

هناك بعض عوامل تصفية الميزات التي تأتي مع الحزمةMicrosoft.FeatureManagement: PercentageFilterو TimeWindowFilterContextualTargetingFilter و.TargetingFilter تتم إضافة جميع عوامل التصفية، باستثناء TargetingFilter، تلقائيا عند تسجيل إدارة الميزات حسب AddFeatureManagement الأسلوب. TargetingFilter تتم إضافة مع الأسلوب المفصل WithTargeting في Targeting القسم أدناه.

كل عامل من عوامل تصفية الميزات المضمنة له معلماته الخاصة. فيما يلي قائمة عوامل تصفية الميزات جنبا إلى جنب مع الأمثلة.

Microsoft.Percentage

يوفر عامل التصفية هذا القدرة على تمكين ميزة استنادا إلى نسبة مئوية محددة.

"EnhancedPipeline": {
    "EnabledFor": [
        {
            "Name": "Microsoft.Percentage",
            "Parameters": {
                "Value": 50
            }
        }
    ]
}

Microsoft.TimeWindow

يوفر عامل التصفية هذا القدرة على تمكين ميزة استنادا إلى نافذة زمنية. إذا تم تحديد فقط End ، يتم اعتبار الميزة قيد التشغيل حتى ذلك الوقت. إذا تم تحديد فقط Start ، يتم النظر في الميزة في جميع النقاط بعد ذلك الوقت.

"EnhancedPipeline": {
    "EnabledFor": [
        {
            "Name": "Microsoft.TimeWindow",
            "Parameters": {
                "Start": "Wed, 01 May 2019 13:59:59 GMT",
                "End": "Mon, 01 Jul 2019 00:00:00 GMT"
            }
        }
    ]
}

يمكن تكوين النافذة الزمنية لتتكرر بشكل دوري. يمكن أن يكون هذا مفيدا للسيناريوهات التي قد يحتاج فيها المرء إلى تشغيل ميزة أثناء فترة حركة مرور منخفضة أو عالية من يوم أو أيام معينة من الأسبوع. لتوسيع النافذة الزمنية الفردية إلى نوافذ الوقت المتكررة، يجب تحديد قاعدة التكرار في المعلمة Recurrence .

إشعار

StartEnd ويجب تحديد كليهما لتمكين Recurrence.

"EnhancedPipeline": {
    "EnabledFor": [
        {
            "Name": "Microsoft.TimeWindow",
            "Parameters": {
                "Start": "Fri, 22 Mar 2024 20:00:00 GMT",
                "End": "Sat, 23 Mar 2024 02:00:00 GMT",
                "Recurrence": {
                    "Pattern": {
                        "Type": "Daily",
                        "Interval": 1
                    },
                    "Range": {
                        "Type": "NoEnd"
                    }
                }
            }
        }
    ]
}

Recurrence تتكون الإعدادات من جزأين: Pattern (عدد مرات تكرار النافذة الزمنية) و Range (مدة تكرار نمط التكرار).

نمط التكرار

هناك نوعان محتملان من أنماط التكرار: Daily و Weekly. على سبيل المثال، يمكن أن تكرر نافذة زمنية "كل يوم" أو "كل ثلاثة أيام" أو "كل يوم اثنين" أو "كل يوم جمعة أخرى".

اعتمادا على النوع، هناك حقول معينة مطلوبة Pattern أو اختيارية أو متجاهلة.

  • Daily

    يتسبب نمط التكرار اليومي في تكرار النافذة الزمنية استنادا إلى عدد الأيام بين كل تكرار.

    الخاصية الصلة ‏‏الوصف
    النوع مطلوب يجب تعيينه إلى Daily.
    الفترة اختياري تحديد عدد الأيام بين كل تكرار. القيمة الافتراضية هي 1.
  • Weekly

    يؤدي نمط التكرار الأسبوعي إلى تكرار النافذة الزمنية في نفس اليوم أو أيام الأسبوع، استنادا إلى عدد الأسابيع بين كل مجموعة من التكرارات.

    الخاصية الصلة ‏‏الوصف
    النوع مطلوب يجب تعيينه إلى Weekly.
    أيام الأسبوع المطلوب يحدد أيام الأسبوع التي يقع فيها الحدث.
    الفترة اختياري تحديد عدد الأسابيع بين كل مجموعة من التكرارات. القيمة الافتراضية هي 1.
    أول يوم من الأسبوع اختياري يحدد اليوم الذي يعتبر اليوم الأول من الأسبوع. القيمة الافتراضية هي Sunday.

    يكرر المثال التالي النافذة الزمنية كل يوم اثنين أو ثلاثاء

    "Pattern": {
        "Type": "Weekly",
        "Interval": 2,
        "DaysOfWeek": ["Monday", "Tuesday"]
    }
    

إشعار

Start يجب أن يكون التكرار الأول صالحا يناسب نمط التكرار. بالإضافة إلى ذلك، لا يمكن أن تكون مدة النافذة الزمنية أطول من عدد مرات حدوثها. على سبيل المثال، من غير الصالح تكرار نافذة زمنية مدتها 25 ساعة كل يوم.

نطاق التكرار

هناك ثلاثة أنواع محتملة لنطاق التكرار: NoEndوEndDate.Numbered

  • NoEnd

    NoEnd يتسبب النطاق في حدوث التكرار إلى أجل غير مسمى.

    الخاصية الصلة ‏‏الوصف
    النوع مطلوب يجب تعيينه إلى NoEnd.
  • EndDate

    EndDate يتسبب النطاق في حدوث النافذة الزمنية في جميع الأيام التي تتناسب مع النمط القابل للتطبيق حتى تاريخ الانتهاء.

    الخاصية الصلة ‏‏الوصف
    النوع مطلوب يجب تعيينه إلى EndDate.
    تاريخ الانتهاء المطلوب تحديد وقت التاريخ لإيقاف تطبيق النمط. طالما أن وقت بدء التكرار الأخير يقع قبل تاريخ الانتهاء، يسمح بوقت انتهاء هذا التكرار أن يمتد إلى ما بعده.

    سيكرر المثال التالي النافذة الزمنية كل يوم حتى يحدث آخر تكرار في 1 أبريل 2024.

    "Start": "Fri, 22 Mar 2024 18:00:00 GMT",
    "End": "Fri, 22 Mar 2024 20:00:00 GMT",
    "Recurrence":{
        "Pattern": {
            "Type": "Daily",
            "Interval": 1
        },
        "Range": {
            "Type": "EndDate",
            "EndDate": "Mon, 1 Apr 2024 20:00:00 GMT"
        }
    }
    
  • Numbered

    Numbered يتسبب النطاق في حدوث النافذة الزمنية لعدد ثابت من المرات (استنادا إلى النمط).

    الخاصية الصلة ‏‏الوصف
    النوع مطلوب يجب تعيينه إلى Numbered.
    NumberOfOccurrences المطلوب تحديد عدد التكرارات.

    سيكرر المثال التالي النافذة الزمنية يومي الاثنين والثلاثاء حتى يكون هناك ثلاثة حالات، والتي تحدث على التوالي في 1 أبريل(Mon) و2 أبريل (Tue) و8 أبريل (Mon).

    "Start": "Mon, 1 Apr 2024 18:00:00 GMT",
    "End": "Mon, 1 Apr 2024 20:00:00 GMT",
    "Recurrence":{
        "Pattern": {
            "Type": "Weekly",
            "Interval": 1,
            "DaysOfWeek": ["Monday", "Tuesday"]
        },
        "Range": {
            "Type": "Numbered",
            "NumberOfOccurrences": 3
        }
    }
    

لإنشاء قاعدة تكرار، يجب تحديد كل من Pattern و Range. يمكن أن يعمل أي نوع نمط مع أي نوع نطاق.

خيارات متقدمة: يتم تطبيق إزاحة المنطقة الزمنية للخاصية Start على إعدادات التكرار.

Microsoft.Targeting

يوفر عامل التصفية هذا القدرة على تمكين ميزة للجمهور المستهدف. يتم شرح شرح متعمق للاستهداف في قسم الاستهداف أدناه. تتضمن معلمات عامل التصفية كائنا Audience يصف المستخدمين والمجموعات والمستخدمين/المجموعات المستبعدة ونسبة مئوية افتراضية من قاعدة المستخدم التي يجب أن يكون لها حق الوصول إلى الميزة. يجب أن يحدد كل كائن مجموعة مدرج في Groups المقطع أيضا النسبة المئوية لأعضاء المجموعة الذين يجب أن يكون لديهم حق الوصول. إذا تم تحديد مستخدم في Exclusion المقطع، إما مباشرة أو إذا كان المستخدم في مجموعة مستبعدة، يتم تعطيل الميزة. وإلا، إذا تم تحديد مستخدم في Users المقطع مباشرة، أو إذا كان المستخدم في النسبة المئوية المضمنة لأي من عمليات الإطلاق التدريجية للمجموعة، أو إذا وقع المستخدم في النسبة المئوية الافتراضية للطرح، تمكين الميزة لهذا المستخدم.

"EnhancedPipeline": {
    "EnabledFor": [
        {
            "Name": "Microsoft.Targeting",
            "Parameters": {
                "Audience": {
                    "Users": [
                        "Jeff",
                        "Alicia"
                    ],
                    "Groups": [
                        {
                            "Name": "Ring0",
                            "RolloutPercentage": 100
                        },
                        {
                            "Name": "Ring1",
                            "RolloutPercentage": 50
                        }
                    ],
                    "DefaultRolloutPercentage": 20,
                    "Exclusion": {
                        "Users": [
                            "Ross"
                        ],
                        "Groups": [
                            "Ring2"
                        ]
                    }
                }
            }
        }
    ]
}

مساحات الأسماء المستعارة لتصفية الميزة

جميع الأسماء المستعارة لعامل تصفية الميزة المضمنة موجودة في مساحة اسم عامل تصفية الميزة Microsoft . هذا لمنع التعارضات مع عوامل تصفية الميزات الأخرى التي قد تشترك في الاسم المستعار نفسه. يتم تقسيم مقاطع مساحة اسم عامل تصفية الميزة حسب الحرف '.'. يمكن الرجوع إلى عامل تصفية الميزة بواسطة الاسم المستعار المؤهل بالكامل مثل Microsoft.Percentage أو بواسطة المقطع الأخير الذي يكون في حالة Microsoft.Percentage .Percentage

استهداف

الاستهداف هو استراتيجية إدارة الميزات التي تمكن المطورين من طرح ميزات جديدة تدريجيا إلى قاعدة المستخدمين الخاصة بهم. تبنى الاستراتيجية على مفهوم استهداف مجموعة من المستخدمين المعروفين باسم الجمهور المستهدف. يتكون الجمهور من مستخدمين محددين ومجموعات ومستخدمين/مجموعات مستبعدة ونسبة مئوية معينة من قاعدة المستخدمين بأكملها. يمكن تقسيم المجموعات المضمنة في الجمهور إلى نسب مئوية من إجمالي أعضائها.

توضح الخطوات التالية مثالا على الإطلاق التدريجي لميزة "بيتا" جديدة:

  1. يتم منح المستخدمين الفرديين Jeff و Alicia حق الوصول إلى Beta
  2. يطلب مستخدم آخر، Mark، الاشتراك ويتم تضمينه.
  3. يتم تضمين 20 بالمائة من مجموعة تعرف باسم مستخدمي "Ring1" في الإصدار التجريبي.
  4. عدد المستخدمين "Ring1" المضمنين في الإصدار التجريبي يصل إلى 100 بالمائة.
  5. يتم تضمين خمسة بالمائة من قاعدة المستخدم في الإصدار التجريبي.
  6. يتم رفع النسبة المئوية للطرح حتى 100 بالمائة ويتم طرح الميزة بالكامل.

هذه الاستراتيجية لنشر ميزة مضمنة في المكتبة من خلال عامل تصفية ميزة Microsoft.Targeting المضمن.

الاستهداف في تطبيق ويب

يتوفر مثال لتطبيق ويب يستخدم عامل تصفية ميزة الاستهداف في مشروع المثال FeatureFlagDemo .

لبدء استخدام TargetingFilter في تطبيق، يجب إضافته إلى مجموعة خدمة التطبيق تماما مثل أي عامل تصفية ميزات آخر. على عكس عوامل التصفية المضمنة الأخرى، TargetingFilter يعتمد على خدمة أخرى لإضافتها إلى مجموعة خدمة التطبيق. هذه الخدمة هي ITargetingContextAccessor.

Microsoft.FeatureManagement.AspNetCoreيوفر تنفيذا ITargetingContextAccessor افتراضيا لاستخراج معلومات الاستهداف من طلب HttpContext. يمكنك استخدام ملحق سياق الاستهداف الافتراضي عند إعداد الاستهداف باستخدام التحميل الزائد غير العام WithTargeting على IFeatureManagementBuilder.

يتم تسجيل ملحق سياق الاستهداف الافتراضي ويتم TargetingFilter تسجيله عن طريق استدعاء WithTargeting على IFeatureManagementBuilder.

services.AddFeatureManagement()
        .WithTargeting();

يمكنك أيضا تسجيل تطبيق مخصص ل ITargetingContextAccessor و TargetingFilter عن طريق استدعاء WithTargeting<T>. فيما يلي مثال لإعداد إدارة الميزات في تطبيق ويب لاستخدام TargetingFilter مع تنفيذ ITargetingContextAccessor يسمى ExampleTargetingContextAccessor.

services.AddFeatureManagement()
        .WithTargeting<ExampleTargetingContextAccessor>();

ITargetingContextAccessor

لاستخدام TargetingFilter في تطبيق ويب، يلزم تنفيذ ITargetingContextAccessor . ويرجع ذلك إلى أنه عند إجراء تقييم مستهدف، تكون هناك حاجة إلى معلومات سياقية مثل المستخدم الذي يتم تقييمه حاليا. تعرف هذه المعلومات باسم TargetingContext. قد تستخرج التطبيقات المختلفة هذه المعلومات من أماكن مختلفة. بعض الأمثلة الشائعة على المكان الذي قد يسحب فيه التطبيق سياق الاستهداف هي سياق HTTP الخاص بالطلب أو قاعدة بيانات.

مثال يستخرج معلومات السياق المستهدفة من سياق HTTP للتطبيق هو الذي DefaultHttpTargetingContextAccessor توفره الحزمة Microsoft.FeatureManagement.AspNetCore . سيتم استخراج معلومات الاستهداف من HttpContext.User. UserId سيتم استخراج المعلومات من Identity.Name الحقل Groups وسيتم استخراج المعلومات من المطالبات من النوع Role. يعتمد هذا التنفيذ على استخدام IHttpContextAccessor، والذي تتم مناقشته هنا.

الاستهداف في تطبيق وحدة التحكم

يعتمد عامل تصفية الاستهداف على سياق استهداف لتقييم ما إذا كان يجب تشغيل ميزة. يحتوي سياق الاستهداف هذا على معلومات مثل المستخدم الذي يتم تقييمه حاليا، وما الذي يجمع المستخدم فيه. في تطبيقات وحدة التحكم، لا يتوفر عادة سياق محيط لتدفق هذه المعلومات إلى عامل تصفية الاستهداف، وبالتالي يجب تمريرها مباشرة عند FeatureManager.IsEnabledAsync استدعاؤها. يتم دعم هذا باستخدام ContextualTargetingFilter. يجب أن تستخدم التطبيقات التي تحتاج إلى تعويم سياق الاستهداف في مدير الميزات هذا بدلا من TargetingFilter.

نظرا لأن ContextualTargetingFilter هو IContextualTargetingFilter<ITargetingContext>، يجب تمرير تنفيذ ITargetingContext إلى IFeatureManager.IsEnabledAsync حتى يتمكن من تقييم ميزة وتشغيلها.

IFeatureManager fm;
…
// userId and groups defined somewhere earlier in application
TargetingContext targetingContext = new TargetingContext
{
   UserId = userId,
   Groups = groups
};

await fm.IsEnabledAsync(featureName, targetingContext);

ContextualTargetingFilter لا يزال يستخدم الاسم المستعار لعامل تصفية الميزة Microsoft.Targeting، لذلك يكون تكوين عامل التصفية هذا متسقا مع ما هو مذكور في هذا القسم.

يتوفر مثال يستخدم ContextualTargetingFilter في تطبيق وحدة التحكم في مشروع مثال TargetingConsoleApp .

استهداف خيارات التقييم

تتوفر خيارات لتخصيص كيفية إجراء تقييم الاستهداف عبر جميع الميزات. يمكن تكوين هذه الخيارات عند إعداد إدارة الميزات.

services.Configure<TargetingEvaluationOptions>(options =>
{
    options.IgnoreCase = true;
});

استبعاد الاستهداف

عند تعريف جماعة مستهدفة، يمكن استبعاد المستخدمين والمجموعات من الجماعة المستهدفة. وهذا مفيد عند طرح ميزة لمجموعة من المستخدمين، ولكن يجب استبعاد عدد قليل من المستخدمين أو المجموعات من الإطلاق. يتم تعريف الاستبعاد عن طريق إضافة قائمة بالمستخدمين والمجموعات إلى Exclusion خاصية الجماعة المستهدفة.

"Audience": {
    "Users": [
        "Jeff",
        "Alicia"
    ],
    "Groups": [
        {
            "Name": "Ring0",
            "RolloutPercentage": 100
        }
    ],
    "DefaultRolloutPercentage": 0
    "Exclusion": {
        "Users": [
            "Mark"
        ]
    }
}

في المثال أعلاه، يتم تمكين الميزة للمستخدمين المسمين Jeff و Alicia. كما تم تمكينه للمستخدمين في المجموعة المسماة Ring0. ومع ذلك، إذا تمت تسمية Markالمستخدم ، يتم تعطيل الميزة، بغض النظر عما إذا كان في المجموعة Ring0 أم لا. تأخذ الاستثناءات الأولوية على بقية عامل تصفية الاستهداف.

المتغيرات

عند إضافة ميزات جديدة إلى أحد التطبيقات، قد يأتي وقت تحتوي فيه الميزة على العديد من خيارات التصميم المقترحة المختلفة. الحل الشائع لاتخاذ قرار بشأن التصميم هو شكل من أشكال اختبار A/B، والذي يتضمن توفير إصدار مختلف من الميزة لشرائح مختلفة من قاعدة المستخدم واختيار إصدار يستند إلى تفاعل المستخدم. في هذه المكتبة، يتم تمكين هذه الوظيفة من خلال تمثيل تكوينات مختلفة لميزة ذات متغيرات.

تمكن المتغيرات علامة الميزة من أن تصبح أكثر من علامة تشغيل/إيقاف تشغيل بسيطة. يمثل المتغير قيمة علامة ميزة يمكن أن تكون سلسلة أو رقما أو قيمة منطقية أو حتى عنصر تكوين. يجب أن تحدد علامة الميزة التي تعلن المتغيرات تحت أي ظروف يجب استخدام كل متغير، والتي تتم تغطيتها بمزيد من التفصيل في قسم تخصيص المتغيرات .

public class Variant
{
    /// <summary>
    /// The name of the variant.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// The configuration of the variant.
    /// </summary>
    public IConfigurationSection Configuration { get; set; }
}

الحصول على المتغيرات

لكل ميزة، يمكن استرداد متغير باستخدام IVariantFeatureManagerأسلوب .GetVariantAsync

…
IVariantFeatureManager featureManager;
…
Variant variant = await featureManager.GetVariantAsync(MyFeatureFlags.FeatureU, CancellationToken.None);

IConfigurationSection variantConfiguration = variant.Configuration;

// Do something with the resulting variant and its configuration

بمجرد استرداد متغير، يمكن استخدام تكوين متغير مباشرة ك IConfigurationSection من خاصية المتغير Configuration . خيار آخر هو ربط التكوين بعنصر باستخدام . نمط ربط تكوين NET.

IConfigurationSection variantConfiguration = variant.Configuration;

MyFeatureSettings settings = new MyFeatureSettings();

variantConfiguration.Bind(settings);

يعتمد المتغير الذي تم إرجاعه على المستخدم الذي يتم تقييمه حاليا، ويتم الحصول على هذه المعلومات من مثيل .TargetingContext يمكن تمرير هذا السياق عند الاستدعاء GetVariantAsync أو يمكن استرداده تلقائيا من تنفيذ ITargetingContextAccessor ما إذا كان مسجلا.

تعريف علامة ميزة المتغير

بالمقارنة مع علامات الميزات العادية، تحتوي علامات الميزات المتغيرة على خاصيتين إضافيتين: variants و allocation. variants الخاصية هي صفيف يحتوي على المتغيرات المعرفة لهذه الميزة. allocation تحدد الخاصية كيفية تخصيص هذه المتغيرات للميزة. تماما مثل الإعلان عن علامات الميزات العادية، يمكنك إعداد علامات ميزة متغيرة في ملف json. فيما يلي مثال على علامة ميزة متغيرة.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyVariantFeatureFlag",
                "enabled": true,
                "allocation": {
                    "default_when_enabled": "Small",
                    "group": [
                        {
                            "variant": "Big",
                            "groups": [
                                "Ring1"
                            ]
                        }
                    ]
                },
                "variants": [
                    { 
                        "name": "Big"
                    },  
                    { 
                        "name": "Small"
                    } 
                ]
            }
        ]
    }
}

تعريف المتغيرات

يحتوي كل متغير على خاصيتين: اسم وتكوين. يتم استخدام الاسم للإشارة إلى متغير معين، والتكوين هو قيمة هذا المتغير. يمكن تعيين التكوين باستخدام configuration_value الخاصية . configuration_value هو تكوين مضمن يمكن أن يكون سلسلة أو رقما أو منطقيا أو كائن تكوين. إذا configuration_value لم يتم تحديد، ستكون خاصية المتغير Configuration الذي تم إرجاعه فارغة.

يتم تعريف قائمة بجميع المتغيرات الممكنة لكل ميزة ضمن الخاصية variants .

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyVariantFeatureFlag",
                "variants": [
                    { 
                        "name": "Big", 
                        "configuration_value": {
                            "Size": 500
                        }
                    },  
                    { 
                        "name": "Small", 
                        "configuration_value": {
                            "Size": 300
                        }
                    } 
                ]
            }
        ]
    }
}

تخصيص المتغيرات

يتم تحديد عملية تخصيص متغيرات الميزة بواسطة allocation خاصية الميزة.

"allocation": { 
    "default_when_enabled": "Small", 
    "default_when_disabled": "Small",  
    "user": [ 
        { 
            "variant": "Big", 
            "users": [ 
                "Marsha" 
            ] 
        } 
    ], 
    "group": [ 
        { 
            "variant": "Big", 
            "groups": [ 
                "Ring1" 
            ] 
        } 
    ],
    "percentile": [ 
        { 
            "variant": "Big", 
            "from": 0, 
            "to": 10 
        } 
    ], 
    "seed": "13973240" 
},
"variants": [
    { 
        "name": "Big", 
        "configuration_value": "500px"
    },  
    { 
        "name": "Small", 
        "configuration_value": "300px"
    } 
]

allocation يحتوي إعداد الميزة على الخصائص التالية:

الخاصية ‏‏الوصف
default_when_disabled تحديد المتغير الذي يجب استخدامه عند طلب متغير أثناء اعتبار الميزة معطلا.
default_when_enabled تحديد المتغير الذي يجب استخدامه عند طلب متغير أثناء اعتبار الميزة ممكنة ولم يتم تعيين أي متغير آخر للمستخدم.
user تحديد متغير وقائمة المستخدمين الذين يجب تعيين هذا المتغير لهم.
group تحديد متغير وقائمة مجموعات. سيتم تعيين المتغير إذا كان المستخدم في مجموعة واحدة على الأقل.
percentile تحديد متغير ونطاق نسبة مئوية يجب أن تلائمه النسبة المئوية المحسوبة للمستخدم لذلك المتغير ليتم تعيينه.
seed تستند القيمة التي تستند إليها حسابات percentile النسبة المئوية. سيكون حساب النسبة المئوية لمستخدم معين هو نفسه عبر جميع الميزات إذا تم استخدام نفس seed القيمة. إذا لم يتم تحديد ، seed إنشاء قيمة أولية افتراضية استنادا إلى اسم الميزة.

في المثال أعلاه، إذا لم يتم تمكين الميزة، سيقوم مدير الميزة بتعيين المتغير الذي تم وضع علامة عليه للمستخدم default_when_disabled الحالي، وهو Small في هذه الحالة.

إذا تم تمكين الميزة، فسيتحقق مدير الميزات من usergroupالتخصيصات و و percentile في هذا الترتيب لتعيين متغير. في هذا المثال المحدد، إذا تمت تسمية المستخدم الذي يتم تقييمه باسم Marsha، في المجموعة المسماة Ring1، أو حدث أن يقع المستخدم بين القيمة المئوية 0 و10، تعيين المتغير المحدد للمستخدم. في هذه الحالة، كل هذه من شأنها أن ترجع Big المتغير . إذا لم تتطابق أي من هذه التخصيصات، يتم تعيين default_when_enabled المتغير للمستخدم، وهو Small.

يشبه منطق التخصيص عامل تصفية ميزة Microsoft.Targeting ، ولكن هناك بعض المعلمات الموجودة في الاستهداف غير الموجودة في التخصيص، والعكس صحيح. لا ترتبط نتائج الاستهداف والتخصيص.

إشعار

للسماح بتخصيص متغيرات الميزات، تحتاج إلى تسجيل ITargetingContextAccessor. يمكن القيام بذلك عن طريق استدعاء WithTargeting<T> الأسلوب .

تجاوز الحالة الممكنة باستخدام متغير

يمكنك استخدام المتغيرات لتجاوز الحالة الممكنة لعلامة ميزة. وهذا يعطي المتغيرات فرصة لتوسيع تقييم علامة ميزة. عند استدعاء IsEnabled علامة ذات متغيرات، سيتحقق مدير الميزات مما إذا كان المتغير المعين للمستخدم الحالي قد تم تكوينه لتجاوز النتيجة. يتم ذلك باستخدام خاصية status_overrideالمتغير الاختيارية . بشكل افتراضي، يتم تعيين هذه الخاصية إلى None، ما يعني أن المتغير لا يؤثر على ما إذا كانت العلامة ممكنة أو معطلة. يسمح الإعداد status_override ل Enabled للمتغير، عند اختياره، بتجاوز علامة ليتم تمكينها. يوفر الإعداد status_override لتوفير Disabled الوظيفة المعاكسة، وبالتالي تعطيل العلامة عند اختيار المتغير. لا يمكن تجاوز ميزة ذات enabled حالة false .

إذا كنت تستخدم علامة ميزة مع متغيرات ثنائية، يمكن أن تكون الخاصية مفيدة status_override جدا. يسمح لك بالاستمرار في استخدام واجهات برمجة التطبيقات مثل IsEnabledAsync وفي FeatureGateAttribute التطبيق الخاص بك، كل ذلك مع الاستفادة من الميزات الجديدة التي تأتي مع المتغيرات، مثل تخصيص القيمة المئوية والبذاءة.

{
    "id": "MyVariantFeatureFlag",
    "enabled": true,
    "allocation": {
        "percentile": [
            {
                "variant": "On",
                "from": 10,
                "to": 20
            }
        ],
        "default_when_enabled":  "Off",
        "seed": "Enhanced-Feature-Group"
    },
    "variants": [
        {
            "name": "On"
        },
        {
            "name": "Off",
            "status_override": "Disabled"
        }
    ]
}

في المثال أعلاه، يتم تمكين الميزة دائما. إذا كان المستخدم الحالي في النطاق المئوية المحسوبة من 10 إلى 20، On إرجاع المتغير. وإلا، Off يتم إرجاع المتغير ولأنه status_override يساوي Disabled، سيتم الآن اعتبار الميزة معطلة.

المتغيرات في إدخال التبعية

يمكن استخدام علامات الميزة المتغيرة بالاقتران مع إدخال التبعية لعرض تطبيقات مختلفة لخدمة لمستخدمين مختلفين. يتم إنجاز ذلك باستخدام الواجهة IVariantServiceProvider<TService> .

IVariantServiceProvider<IAlgorithm> algorithmServiceProvider;
...

IAlgorithm forecastAlgorithm = await algorithmServiceProvider.GetServiceAsync(cancellationToken); 

في القصاصة البرمجية أعلاه، يسترد IVariantServiceProvider<IAlgorithm> تنفيذ من IAlgorithm حاوية حقن التبعية. يعتمد التنفيذ المختار على:

  • علامة الميزة التي IAlgorithm تم تسجيل الخدمة بها.
  • المتغير المخصص لتلك الميزة.

IVariantServiceProvider<T> يتم توفير للتطبيق عن طريق استدعاء IFeatureManagementBuilder.WithVariantService<T>(string featureName). راجع ما يلي للاطلاع على مثال.

services.AddFeatureManagement() 
        .WithVariantService<IAlgorithm>("ForecastAlgorithm");

الاستدعاء أعلاه IVariantServiceProvider<IAlgorithm> متاح في مجموعة الخدمة. يجب إضافة تطبيقات IAlgorithm بشكل منفصل عبر أسلوب إضافة مثل services.AddSingleton<IAlgorithm, SomeImplementation>(). يعتمد تنفيذ IAlgorithm ذلك المستخدم IVariantServiceProvider على ForecastAlgorithm علامة ميزة المتغير. إذا لم تتم إضافة أي تنفيذ IAlgorithm إلى مجموعة الخدمة، فترجع IVariantServiceProvider<IAlgorithm>.GetServiceAsync() مهمة بنتيجة فارغة.

{
    // The example variant feature flag
    "id": "ForecastAlgorithm",
    "enabled": true,
    "variants": [
        { 
            "Name": "AlgorithmBeta" 
        },
        ...
    ] 
}

سمة الاسم المستعار لخدمة المتغير

[VariantServiceAlias("Beta")]
public class AlgorithmBeta : IAlgorithm
{
    ...
}

سيستخدم موفر الخدمة المتغير أسماء أنواع التطبيقات لمطابقة المتغير المخصص. إذا تم تزيين خدمة متغيرة ب VariantServiceAliasAttribute، يجب استخدام الاسم المعلن في هذه السمة في التكوين للإشارة إلى هذه الخدمة المتغيرة.

القياس عن بعد

عند نشر تغيير علامة ميزة، غالبا ما يكون من المهم تحليل تأثيره على أحد التطبيقات. على سبيل المثال، فيما يلي بعض الأسئلة التي قد تنشأ:

  • هل تم تمكين/تعطيل العلامات الخاصة بي كما هو متوقع؟
  • هل يمكن للمستخدمين المستهدفين الوصول إلى ميزة معينة كما هو متوقع؟
  • ما هو المتغير الذي يراه مستخدم معين؟

يمكن الإجابة عن هذه الأنواع من الأسئلة من خلال انبعاث وتحليل أحداث تقييم علامة الميزة. تستخدم هذه المكتبة System.Diagnostics.Activity واجهة برمجة التطبيقات لإنتاج تتبع تتبع عن بعد أثناء تقييم علامة الميزة.

تمكين بيانات تتبع الاستخدام

بشكل افتراضي، لا يتم إصدار بيانات تتبع الاستخدام لعلامات الميزات. لنشر بيانات تتبع الاستخدام لعلامة ميزة معينة، يجب أن تعلن العلامة أنها ممكنة لانبعاث بيانات تتبع الاستخدام.

بالنسبة لعلامات الميزات المحددة في appsettings.json، يتم ذلك باستخدام الخاصية telemetry .

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyFeatureFlag",
                "enabled": true,
                "telemetry": {
                    "enabled": true
                }
            }
        ]
    }
}

تحدد القصاصة البرمجية appsettings أعلاه علامة ميزة مسماة MyFeatureFlag تم تمكينها لبيانات تتبع الاستخدام. يشار إلى ذلك بواسطة telemetry الكائن الذي يعين enabled إلى صحيح. يجب أن تكون true قيمة الخاصية enabled لنشر بيانات تتبع الاستخدام للعلامة.

يحتوي telemetry قسم علامة الميزة على الخصائص التالية:

الخاصية ‏‏الوصف
enabled تحديد ما إذا كان يجب نشر بيانات تتبع الاستخدام لعلامة الميزة.
metadata مجموعة من أزواج قيم المفاتيح، على غرار قاموس، والتي يمكن استخدامها لإرفاق بيانات تعريف مخصصة حول علامة الميزة لأحداث التقييم.

نشر بيانات تتبع الاستخدام المخصصة

يمتلك مدير الميزات اسم "Microsoft.FeatureManagement" الخاص ActivitySource به. إذا telemetry تم تمكين علامة ميزة، كلما بدأ تقييم علامة الميزة، سيبدأ Activityمدير الميزات . عند الانتهاء من تقييم علامة الميزة، سيقوم مدير الميزات بإضافة مسمى ActivityEvent "FeatureFlag" إلى النشاط الحالي. "FeatureFlag" سيكون للحدث علامات تتضمن معلومات حول تقييم علامة الميزة. على وجه التحديد، ستتضمن العلامات الحقول التالية:

علامة ‏‏الوصف
FeatureName اسم علامة الميزة.
Enabled ما إذا كان يتم تقييم علامة الميزة على أنها ممكنة.
Variant المتغير المعين.
VariantAssignmentReason سبب تعيين المتغير.
TargetingId معرف المستخدم المستخدم للاستهداف.

إشعار

سيتم أيضا تضمين جميع أزواج القيمة الرئيسية المحددة في telemetry.metadata علامة الميزة في العلامات.

لتمكين نشر بيانات تتبع الاستخدام المخصصة، يمكنك إنشاء ActivityListener والاستماع إلى Microsoft.FeatureManagement مصدر النشاط. فيما يلي مثال يوضح كيفية الاستماع إلى مصدر نشاط إدارة الميزات وإضافة رد اتصال عند تقييم ميزة.

ActivitySource.AddActivityListener(new ActivityListener()
{
    ShouldListenTo = (activitySource) => activitySource.Name == "Microsoft.FeatureManagement",
    Sample = (ref ActivityCreationOptions<ActivityContext> options) => ActivitySamplingResult.AllData,
    ActivityStopped = (activity) =>
    {
        ActivityEvent? evaluationEvent = activity.Events.FirstOrDefault((activityEvent) => activityEvent.Name == "FeatureFlag");

        if (evaluationEvent.HasValue && evaluationEvent.Value.Tags.Any())
        {
            // Do something.
        }
    }
});

لمزيد من المعلومات، يرجى الانتقال إلى تجميع تتبع موزع.

Application Insights Telemetry Publisher

Microsoft.FeatureManagement.Telemetry.ApplicationInsights توفر الحزمة ناشر بيانات تتبع الاستخدام مضمنا يرسل بيانات تقييم علامة الميزة إلى Application Insights. للاستفادة من ذلك، أضف مرجعا إلى الحزمة وسجل ناشر بيانات تتبع الاستخدام Application Insights كما هو موضح أدناه.

builder.services
    .AddFeatureManagement()
    .AddApplicationInsightsTelemetryPublisher();

Microsoft.FeatureManagement.Telemetry.ApplicationInsights توفر الحزمة مهيئ بيانات تتبع الاستخدام الذي يقوم تلقائيا بوضع علامة على جميع الأحداث بحيث TargetingId يمكن ربط الأحداث بتقييمات العلامة. لاستخدام مهيئ بيانات تتبع الاستخدام، TargetingTelemetryInitializerأضفه إلى مجموعة خدمة التطبيق.

builder.Services.AddSingleton<ITelemetryInitializer, TargetingTelemetryInitializer>();

إشعار

لضمان أن TargetingTelemetryInitializer يعمل كما هو متوقع، يجب استخدام الموضح TargetingHttpContextMiddleware أدناه.

لتمكين استمرار سياق الاستهداف في النشاط الحالي، يمكنك استخدام TargetingHttpContextMiddleware.

app.UseMiddleware<TargetingHttpContextMiddleware>();

يمكن العثور على مثال لاستخدامه في مثال EvaluationDataToApplicationInsights .

المتطلب الأساسي

يعتمد ناشر بيانات تتبع الاستخدام هذا على Application Insights الذي يتم إعداده بالفعل وتسجيله كخدمة تطبيق. على سبيل المثال، يتم ذلك هنا في مثال التطبيق.

التخزين المؤقت

يتم توفير حالة الميزة IConfiguration من قبل النظام. من المتوقع أن تتم معالجة أي تخزين مؤقت وتحديث ديناميكي من قبل موفري التكوين. يطلب مدير الميزات IConfiguration أحدث قيمة لحالة الميزة كلما تم التحقق من ميزة ليتم تمكينها.

اللقطة

هناك سيناريوهات تتطلب بقاء حالة الميزة متسقة أثناء مدة بقاء الطلب. قد تتغير القيم التي تم إرجاعها من المعيار IFeatureManager إذا IConfiguration تم تحديث المصدر الذي يسحب منه أثناء الطلب. يمكن منع ذلك باستخدام IFeatureManagerSnapshot. IFeatureManagerSnapshot يمكن استرداده بنفس طريقة IFeatureManager. IFeatureManagerSnapshot ينفذ واجهة IFeatureManager، ولكنه يقوم بالتخزين المؤقت للحالة الأولى التي تم تقييمها لميزة أثناء الطلب وإرجاع نفس حالة الميزة خلال مدة بقائها.

موفرو الميزات المخصصة

يتيح تنفيذ موفر ميزات مخصص للمطورين سحب علامات الميزات من مصادر مثل قاعدة بيانات أو خدمة إدارة الميزات. يقوم موفر الميزات المضمن الذي يتم استخدامه افتراضيا بسحب علامات الميزة من نظام تكوين .NET Core. يسمح هذا بتعريف الميزات في ملف appsettings.json أو في موفري التكوين مثل Azure App Configuration. يمكن استبدال هذا السلوك لتوفير التحكم الكامل في المكان الذي تتم قراءة تعريفات الميزات منه.

لتخصيص تحميل تعريفات الميزات، يجب على المرء تنفيذ الواجهة IFeatureDefinitionProvider .

public interface IFeatureDefinitionProvider
{
    Task<FeatureDefinition> GetFeatureDefinitionAsync(string featureName);

    IAsyncEnumerable<FeatureDefinition> GetAllFeatureDefinitionsAsync();
}

لاستخدام تنفيذ IFeatureDefinitionProvider، يجب إضافته إلى مجموعة الخدمة قبل إضافة إدارة الميزات. يضيف المثال التالي تنفيذا ل IFeatureDefinitionProvider يسمى InMemoryFeatureDefinitionProvider.

services.AddSingleton<IFeatureDefinitionProvider, InMemoryFeatureDefinitionProvider>()
        .AddFeatureManagement()

الخطوات التالية

لمعرفة كيفية استخدام علامات الميزات في التطبيقات الخاصة بك، تابع إلى قوالب التشغيل السريع التالية.

لمعرفة كيفية استخدام عوامل تصفية الميزات، تابع إلى البرامج التعليمية التالية.

لمعرفة كيفية تشغيل التجارب باستخدام علامات الميزات المتغيرة، تابع إلى البرنامج التعليمي التالي.