.NET Feature Management
توفر مكتبة إدارة ميزات .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>
يمكن أن تشير العلامة إلى ميزات/متغيرات متعددة عن طريق تحديد قائمة مفصولة بفواصل من الميزات/المتغيرات في السمة/name
variant
.
<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
و TimeWindowFilter
ContextualTargetingFilter
و.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
.
إشعار
Start
End
ويجب تحديد كليهما لتمكين 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
استهداف
الاستهداف هو استراتيجية إدارة الميزات التي تمكن المطورين من طرح ميزات جديدة تدريجيا إلى قاعدة المستخدمين الخاصة بهم. تبنى الاستراتيجية على مفهوم استهداف مجموعة من المستخدمين المعروفين باسم الجمهور المستهدف. يتكون الجمهور من مستخدمين محددين ومجموعات ومستخدمين/مجموعات مستبعدة ونسبة مئوية معينة من قاعدة المستخدمين بأكملها. يمكن تقسيم المجموعات المضمنة في الجمهور إلى نسب مئوية من إجمالي أعضائها.
توضح الخطوات التالية مثالا على الإطلاق التدريجي لميزة "بيتا" جديدة:
- يتم منح المستخدمين الفرديين Jeff و Alicia حق الوصول إلى Beta
- يطلب مستخدم آخر، Mark، الاشتراك ويتم تضمينه.
- يتم تضمين 20 بالمائة من مجموعة تعرف باسم مستخدمي "Ring1" في الإصدار التجريبي.
- عدد المستخدمين "Ring1" المضمنين في الإصدار التجريبي يصل إلى 100 بالمائة.
- يتم تضمين خمسة بالمائة من قاعدة المستخدم في الإصدار التجريبي.
- يتم رفع النسبة المئوية للطرح حتى 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
في هذه الحالة.
إذا تم تمكين الميزة، فسيتحقق مدير الميزات من user
group
التخصيصات و و 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()
الخطوات التالية
لمعرفة كيفية استخدام علامات الميزات في التطبيقات الخاصة بك، تابع إلى قوالب التشغيل السريع التالية.
لمعرفة كيفية استخدام عوامل تصفية الميزات، تابع إلى البرامج التعليمية التالية.
لمعرفة كيفية تشغيل التجارب باستخدام علامات الميزات المتغيرة، تابع إلى البرنامج التعليمي التالي.