اشتراکها
نظرات مطالب
غنی سازی کامپایلر C# 9.0 با افزونهها
پروژهی «StyleCopAnalyzers» که از سال 2019، ارائهی پایداری نداشته، مجددا در حال پیگیری است و فعلا نگارش بتای جدید آن در دسترس است.
فرض کنید میخواهید برای بخشهایی از نرم افزاری که طراحی کردهاید ، امکانی را در نظر بگیرید که بتوانید زمانیکه نرم افزار در حال استفادهاست، قابلیتهایی از آنرا فعال یا غیرفعال نمایید؛ بدون اینکه نرم افزار از دسترس خارج شود. Feature Toggle که تحت عنوان Feature Flag هم شناخته میشود همین امکان را برای ما به ارمغان میآورد و ما را قادر میسازد تا قابلیتهایی را از نرم افزار، فعال یا غیرفعال کنیم، بدون اینکه نیاز باشد نرم افزار از دسترس مشتریان خارج شود و یا نیاز باشد نسخهی جدیدی از نرم افزار منتشر شود. برای مثال قابلیت ثبت نام کاربران را در بازههای خاصی غیرفعال کنیم و یا فرض کنید قابلیت جدیدی به نرم افزار اضافه کردهاید و میخواهید بعد از پابلیش، در یک بازه زمانی که نرم افزار شما بازدید کنندههای کمتری دارد، آنرا موقتا فعال کنید، نتیجه خروجی را ببینید و سپس آن را غیر فعال نمایید. در ادامه این مقاله سعی خواهیم کرد ابتدا با یک مثال ساده با این قابلیت آشنا شویم و سپس به معرفی یکی از کتابخانههای محبوب در این زمینه بپردازیم.
Feature Toggle چیزی بیشتر از یک دستور IF نیست، اگر شرط مورد نظر برقرار بود، کد را اجرا میکند، در غیر اینصورت از اجرای آن بخش صرف نظر میکند.
IF (currentYear<2023){ alert('Wear a mask!'); }
var showCoronaAlert=_cofiguration.GetValue<bool>("Features:showCoronaAlert"); // or read this from Database
If(showCoronaAlert){
alert(Wear a amask!);
}
در این روش بجای اینکه تاریخ را چک کنیم و بر اساس آن تصمیم بگیریم که آیا پیغامی نمایش داده شود یا نه، وضعیت نمایش آن را از فایل تنظیمات و یا دیتابیس خواندهایم. در این حالت دیگر نیازی به تغییر و انتشار نسخهی جدیدی از نرم افزار نیست و فقط کافیاست مقدار مربوط به نمایش پیغام را در دیتابیس و یا فایل تنظیمات، به روزسانی نماییم.
کتابخانه Microsoft.FeatureManagement توسط تیم اژور پیاده سازی و نوشته شدهاست و برای خواندن اطلاعات، از همان IConfiguration استفاده میکند که ما را قادر میسازد تنظیمات را از منابع مختلفی بخوانیم و همچنین قابلیتهای آن فراتر از تنظیم یک مقدار با true/false میباشد که در ادامه با بعضی از آنها آشنا خواهیم شد.
ابتدا نیاز هست این کتابخانه را به صورت زیر نصب نماییم :
Install-Package Microsoft.FeatureManagement
سپس نیاز هست در متد ConfigureService، سرویس مربوطه را اضافه نماییم :
using Microsoft.FeatureManagement; public void ConfigureServices(IServiceCollection services) { services.AddFeatureManagement(); }
این کتابخانه به صورت پیش فرض، اطلاعات featureها را از بخشی (section) تحت عنوان FeatureManagement از فایل appsetting.json میخواند. پس نیاز داریم این بخش را در appsetting.json تعریف نماییم ( لیست تمامی قابلیتهایی را که قصد داریم به صورت داینامیک فعال/غیرفعال کنیم، در این بخش اضافه خواهیم کرد):
"FeatureManagement": { }
اگر تمایل داشتید از اسم دیگری برای بخش تنظیمات، در فایل appsetting. json استفاده نمایید، میتوانید به صورت زیر این کار را انجام دهید :
public void ConfigureServices(IServiceCollection services) { services.AddFeatureManagement(Configuration.GetSection("MyFeatureManagement")) }
در این مقاله از همان اسم پیش فرض استفاده شده است.
افزودن یک قابلیت جدید
"FeatureManagement": { "MaskAlert":true }
public class HomeController : Controller { private readonly IFeatureManager _featureManager; public HomeController(IFeatureManager featureManager) { _featureManager = featureManager; } public async Task<IActionResult> Index() { if(await _featureManager.IsEnabledAsync("MaskAlert")) { // show messeage } return View(); } }
فعال سازی بر اساس تاریخ (TimeWindowsFilter)
یکی از قابلیتهای این کتابخانه، فعال سازی بر اساس بازه زمانی هست. اگر نیاز دارید یک قابلیت در یک بازهی خاص فعال شود، میتوانید از این قابلیت استفاده کنید. برای فعال سازی این امکان، باید فیلتر TimeWindowFilter را که به صورت توکار به همراه کتابخانه وجود دارد، به صورت زیر در متد configureServices ثبت نماییم:
public void ConfigureServices(IServiceCollection services) { services.AddFeatureManagement().AddFeatureFilter<TimeWindowFilter>(); }
"FeatureManagement": { "EmergencyBanner": { "EnabledFor": [ { "Name": "Microsoft.TimeWindow", "Parameters": { "Start": "01 Mar 2021 12:00:00 +00:00", "End": "01 Apr 2021 12:00:00 +00:00" } } ] } }
if(await _featureManager.IsEnabledAsync("EmergencyBanner")){ // show Emergency banner }
پارامترهای Start و End میتوانند به صورت تکی هم استفاده شوند؛ به این معنا که میتوانید فقط پارامتر start را مقدار دهی کنید و در این حالت از تاریخ مورد نظر به بعد، Feature مورد نظر فعال میباشد و یا اگر فقط پارامتر End مقدار دهی شود، Feature مورد نظر فقط تا تاریخ تعیین شده فعال هست و بعد از آن برای همیشه غیرفعال میشود.
در زیر، نمونهای از این حالت تنظیم شدهاست :
"FeatureManagement": { "EmergencyBanner": { "EnabledFor": [ { "Name": "Microsoft.TimeWindow", "Parameters": { "End": "01 Apr 2021 12:00:00 +00:00" } } ] } }
فیلترهای سفارشی
از دیگر مزایای این کتابخانه این هست که محدود به فیلترهای توکار خود آن نیستیم و امکان توسعه و نوشتن فیلترهای سفارشی را به ما میدهد. برای مثال اگر یک قابلیت را در نرم افزار پیاده سازی کردهایم که میخواهیم فقط بر روی مرورگرهای خاصی در دسترس باشد، میتوانیم به صورت زیر این کار را انجام دهیم:
ابتدا در appsetting.json قابلیت (Feature) مورد نظر را به صورت زیر تعریف میکنیم :
"FeatureManagement": { "ChatV2": { "EnabledFor": [ { "Name": "BrowserFilter", "Parameters": { "AllowedBrowsers": [ "Chrome" ] } } ] } }
[FilterAlias("BrowserFilter")] public class BrowserFilter:IFeatureFilter { private readonly IHttpContextAccessor _httpContextAccessor; public BrowserFilter(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); } public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context) { var userAgent = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString(); var settings = context.Parameters.Get<BrowserFilterSettings>(); return Task.FromResult(settings.AllowedBrowsers.Any(userAgent.Contains)); } }
public class BrowserFilterSettings { public string[] AllowedBrowsers { get; set; } }
IHttpContextAccessor
را هم ثبت نماییم: public void ConfigureServices(IServiceCollection services) { services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddFeatureManagement() .AddFeatureFilter<BrowserFilter>(); }
if(await _featureManager.IsEnabledAsync("ChatV2")){ // do something }
* از دیگر قابلیتهای این کتابخانه، فعال و غیر فعال کردن کنترلر و اکشن متدها بر اساس وضعیت Featureها میباشد که در بخش دوم این مقاله به توضیح این موارد خواهیم پرداخت.
- VS is more responsive when running Git operations.
- Debugging large solutions with
/debug:fastlink
PDBs is more robust. Changes in the PDB/DIA lead to reduced latency and a 30% reduction in heap memory consumption in the VS debugger that used to cause crashes. - C++ compiler bugfixes:
- Fix for the SSA optimizer incorrectly sinking a function call past a store to a variable used in a
__finally
handler. - Fix for the SSA optimizer sometimes incorrectly analyzing memory loads from locations with negative offsets.
- Fix for the optimizer incorrectly transforming a pre-incremented loop into a post-incremented loop. This was found compiling the ICU project.
- Fix for the SSA optimizer incorrectly sinking a function call past a store to a variable used in a
- Microsoft bumped up the Java™ Development Kit 8 to Update 172 (JDK version 8u172).
نظرات مطالب
هزینه استفاده از دات نت فریم ورک چقدر است؟
مجوز رو میتونید اینجا مطالعه کنید:
http://www.opensource.org/licenses/ms-pl.html
و زمانیکه در این سایت مطرح شده یعنی پذیرفته شده و معتبر است.
توضیحات بیشتر هم در این سؤال و جواب:
http://programmers.stackexchange.com/questions/85301/understanding-the-microsoft-public-license-ms-pl
http://www.opensource.org/licenses/ms-pl.html
و زمانیکه در این سایت مطرح شده یعنی پذیرفته شده و معتبر است.
توضیحات بیشتر هم در این سؤال و جواب:
http://programmers.stackexchange.com/questions/85301/understanding-the-microsoft-public-license-ms-pl
نظرات مطالب
هزینه استفاده از دات نت فریم ورک چقدر است؟
مجوز رو میتونید اینجا مطالعه کنید:
http://www.opensource.org/licenses/ms-pl.html
و زمانیکه در این سایت مطرح شده یعنی پذیرفته شده و معتبر است.
توضیحات بیشتر هم در این سؤال و جواب:
http://programmers.stackexchange.com/questions/85301/understanding-the-microsoft-public-license-ms-pl
http://www.opensource.org/licenses/ms-pl.html
و زمانیکه در این سایت مطرح شده یعنی پذیرفته شده و معتبر است.
توضیحات بیشتر هم در این سؤال و جواب:
http://programmers.stackexchange.com/questions/85301/understanding-the-microsoft-public-license-ms-pl
اشتراکها