نکاتی که منجر به کارآیی بالای Kesterl شدهاند: ASP.NET Core Kestrel - The Need for Speed
نظرات مطالب
EF Code First #3
- اگر lazy loading فعال باشد، خیر.
- همچنین نیاز است کارآیی برنامه را بر اساس یک سری از الگوهای مشخصی سنجید. برای این منظور از برنامهی DNT Profiler استفاده کنید.
- همچنین نیاز است کارآیی برنامه را بر اساس یک سری از الگوهای مشخصی سنجید. برای این منظور از برنامهی DNT Profiler استفاده کنید.
نظرات مطالب
متد LastOrDefault در EF
مورد اول اصلا توصیه نکنید بعدها به دلیل مشکل کارآیی که داره خیلی اذیت میکنه همون مورد دوم تنها گزینه و بهترین گزینه است!
نظرات مطالب
سرریز اعداد و checked در #C
روش دیگر کامپایل کردن کد با پارامتر زیر است
در کل کارآیی این روش حدود سه بار کندتر است از روش معمولی بدون checked و اگر مشکل یافت شده بهتر است از بازه صحیح اعداد استفاده شود.
/checked
پاسخ به بازخوردهای پروژهها
طراحی رابط کاربری - راهنمایی فنی
«آیا این تگ برای انتشار نهایی باید دستی پاک بشه؟»
بله. اگر حذف نشود، تمام اعمال را باز هم لاگ میکند که روی کارآیی تاثیر منفی خواهد گذاشت.
بله. اگر حذف نشود، تمام اعمال را باز هم لاگ میکند که روی کارآیی تاثیر منفی خواهد گذاشت.
پاسخ به بازخوردهای پروژهها
چند متد الحاقی پیشنهادی
اگر این متد رو به صورت fluent بنویسی کار میکنه یعنی str.append.append.append الی آخر. البته بهینه نیست و استفاده از StringBulder زیر 600 بار جمع زدن رشتهها کارآیی کمتری از استفاده از + معمولی داره.
فایلهای پروژهها
DNTViewer.V1.2.zip
- بهبود کارآیی و سرعت نمایش لیستهای طولانی
- نمایش لیست آخرین موارد در ابتدای کار برنامه
- نمایش لیست آخرین موارد در ابتدای کار برنامه
امکان تبدیل رخدادهای توکار مرورگرها به دایرکتیوهای Blazor در Blazor6x
یکسری دایرکتیو مانند onclick@ و امثال آن، از پیش در Blazor تعریف شدهاند که امکان مدیریت رویدادهای جاوااسکریپتی را در کدهای سیشارپ میسر میکنند. اما تعداد اینها زیاد نیست. برای مثال تعداد رویدادهای قابل تعریف و پشتیبانی شدهی توسط مرورگرها قابل ملاحظهاست. در Blazor 6x روشی جهت دسترسی سادهتر به این رویدادها ارائه شدهاست که شامل این مراحل است. برای نمونه فرض کنید میخواهیم به رویداد paste مرورگر دسترسی پیدا کنیم و یک دایرکتیو سفارشی oncustompaste@ را برای آن تهیه کنیم:
<input @oncustompaste="HandleCustomPaste" />
<script> Blazor.registerCustomEventType('custompaste', { browserEventName: 'paste', createEventArgs: event => { // This example only deals with pasting text, but you could use arbitrary JavaScript APIs // to deal with users pasting other types of data, such as images return { eventTimestamp: new Date(), pastedData: event.clipboardData.getData('text') }; } }); </script>
پس از اینکار، معادل دو پارامتر بازگشت داده شده را به صورت زیر در کدهای سیشارپ تهیه میکنیم:
namespace BlazorCustomEventArgs.CustomEvents { [EventHandler("oncustompaste", typeof(CustomPasteEventArgs), enableStopPropagation: true, enablePreventDefault: true)] public static class EventHandlers { // This static class doesn't need to contain any members. It's just a place where we can put // [EventHandler] attributes to configure event types on the Razor compiler. This affects the // compiler output as well as code completions in the editor. } public class CustomPasteEventArgs : EventArgs { // Data for these properties will be supplied by custom JavaScript logic public DateTime EventTimestamp { get; set; } public string PastedData { get; set; } } }
یک نکته: در اینجا نام oncustompaste به همان نام custompaste کدهای جاوااسکریپتی اشاره میکند. نام تعریف شدهی در قسمت سیشارپ، یک on در ابتدا اضافهتر دارد. اینکار سبب میشود که اکنون بتوان یک رویدادگردان oncustompaste@ سفارشی را که قابل مدیریت در کدهای سیشارپ است، داشت:
@page "/" <p>Try pasting into the following text box:</p> <input @oncustompaste="HandleCustomPaste" /> <p>@message</p> @code { string message; void HandleCustomPaste(CustomPasteEventArgs eventArgs) { message = $"At {eventArgs.EventTimestamp.ToShortTimeString()}, you pasted: {eventArgs.PastedData}"; } }
ذخیره سازی اطلاعات بازدیدهای کاربران، در طول زمان حجم بالایی از بانک اطلاعاتی را به خود اختصاص خواهد داد؛ به علاوه کند شدن کوئریهای مرتبط با آن، به همراه مصرف بالای منابع سیستم. به همین جهت اکثر سایتها از Google analytics برای مدیریت جمع آوری بازدیدهای کاربران خود استفاده میکنند و این ابزار واقعا عالی و حرفهای طراحی شده و پیاده سازی همانند آن شاید در حد یک پروژهی چندساله باشد.
اضافه کردن Google analytics به یک سایت، بسیار ساده است. در آن ثبت نام میکنید؛ سپس آدرس دومین خود را وارد کرده و یک قطعه کد جاوا اسکریپتی را دریافت خواهید کرد که باید به انتهای تمام صفحات سایت خود اضافه نمائید و ... همین.
اضافه کردن این کد در ASP.NET MVC میتواند در فایل layout یا همان master page سایت انجام شود تا به صورت خودکار به تمام صفحات اعمال گردد.
مشکل!
من نمیخواهم که صفحات غیرعمومی سایت نیز دارای کدهای Google analytics باشند و بیجهت Google به اینجاها نیز سرکشی زاید کند! چکار باید کرد؟
احتمالا عنوان میکنید که باید یک if و else به همراه آرایهای از نامها و آدرسهای صفحات غیرعمومی سایت تهیه کرد و بر این اساس کدهای Google analytics را در master page درج کرد یا خیر.
بله. این روش کار میکنه ولی بهینه نیست و همچنین نگهداری آن در طول زمان مشکل است. سایت توسعه خواهد یافت، صفحات غیرعمومی بیشتر خواهند شد و ممکن است در این بین فراموش شود که کدهای مرتبط به روز شوند.
روش بهتر:
آیا میتوان در یک View مشخص کرد که فیلتر Authorize در اکشن متد متناظری که آنرا رندر کرده است بکار گرفته شده است یا خیر؟
صفحات غیرعمومی سایت در ASP.NET MVC با فیلتر Authorize محافظت میشوند. این فیلتر را میتوان به کل یک کنترلر اعمال کرد تا به تمام اکشن متدهای آن اعمال شود؛ یا فقط به یک اکشن متد خاص که Viewایی خاص را رندر میکند.
نحوه پیاده سازی تشخیص وجود فیلتر Authorize را در یک View رندر شده، در متد کمکی زیر میتوان مشاهده کرد:
توضیحات:
این متد در فایلی به نام HtmlUtils قرار گرفته در پوشه app_code تعریف شده است و بکارگیری آن در یک فایل master page به نحو زیر خواهد بود:
در این متد به کمک خاصیت page.ViewContext.Controller میتوان به کنترلری که در حال رندر کردن View جاری است دسترسی یافت. اکنون که به کنترلر دسترسی داریم، به کمک Reflection، ویژگیها یا Attributes آنرا یافته و بررسی میکنیم که آیا دارای AuthorizeAttribute است یا خیر. بر این اساس میتوان تصمیم گرفت که آیا View در حال نمایش عمومی است یا خصوصی. اگر عمومی بود، کدهای اسکریپتی Google analytics به صورت خودکار به صفحه تزریق میشوند.
همچنین در اینجا فرض بر این است که Id منتسب به دومین جاری در کلیدی به نام GoogleAnalyticsID در فایل کانفیگ برنامه در قسمت app settings آن تعریف شده است.
اضافه کردن Google analytics به یک سایت، بسیار ساده است. در آن ثبت نام میکنید؛ سپس آدرس دومین خود را وارد کرده و یک قطعه کد جاوا اسکریپتی را دریافت خواهید کرد که باید به انتهای تمام صفحات سایت خود اضافه نمائید و ... همین.
اضافه کردن این کد در ASP.NET MVC میتواند در فایل layout یا همان master page سایت انجام شود تا به صورت خودکار به تمام صفحات اعمال گردد.
مشکل!
من نمیخواهم که صفحات غیرعمومی سایت نیز دارای کدهای Google analytics باشند و بیجهت Google به اینجاها نیز سرکشی زاید کند! چکار باید کرد؟
احتمالا عنوان میکنید که باید یک if و else به همراه آرایهای از نامها و آدرسهای صفحات غیرعمومی سایت تهیه کرد و بر این اساس کدهای Google analytics را در master page درج کرد یا خیر.
بله. این روش کار میکنه ولی بهینه نیست و همچنین نگهداری آن در طول زمان مشکل است. سایت توسعه خواهد یافت، صفحات غیرعمومی بیشتر خواهند شد و ممکن است در این بین فراموش شود که کدهای مرتبط به روز شوند.
روش بهتر:
آیا میتوان در یک View مشخص کرد که فیلتر Authorize در اکشن متد متناظری که آنرا رندر کرده است بکار گرفته شده است یا خیر؟
صفحات غیرعمومی سایت در ASP.NET MVC با فیلتر Authorize محافظت میشوند. این فیلتر را میتوان به کل یک کنترلر اعمال کرد تا به تمام اکشن متدهای آن اعمال شود؛ یا فقط به یک اکشن متد خاص که Viewایی خاص را رندر میکند.
نحوه پیاده سازی تشخیص وجود فیلتر Authorize را در یک View رندر شده، در متد کمکی زیر میتوان مشاهده کرد:
@helper IncludeGoogleAnalytics(WebViewPage page) { var controller = page.ViewContext.Controller; var controllerHasAuthorizeAttribute = controller.GetType().GetCustomAttributes(typeof(AuthorizeAttribute), true).Any(); var currentActionName = page.ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString(); var actionHasAuthorizeAttribute = controller.GetType().GetMethods() .Where(x => x.Name == currentActionName && x.GetCustomAttributes(typeof(AuthorizeAttribute), true).Any()) .Any(); if (!controllerHasAuthorizeAttribute && !actionHasAuthorizeAttribute) { string trackingId = ConfigurationManager.AppSettings["GoogleAnalyticsID"]; <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', '@trackingId']); _gaq.push(['_trackPageview']); (function () { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> }
توضیحات:
این متد در فایلی به نام HtmlUtils قرار گرفته در پوشه app_code تعریف شده است و بکارگیری آن در یک فایل master page به نحو زیر خواهد بود:
@HtmlUtils.IncludeGoogleAnalytics(this)
در این متد به کمک خاصیت page.ViewContext.Controller میتوان به کنترلری که در حال رندر کردن View جاری است دسترسی یافت. اکنون که به کنترلر دسترسی داریم، به کمک Reflection، ویژگیها یا Attributes آنرا یافته و بررسی میکنیم که آیا دارای AuthorizeAttribute است یا خیر. بر این اساس میتوان تصمیم گرفت که آیا View در حال نمایش عمومی است یا خصوصی. اگر عمومی بود، کدهای اسکریپتی Google analytics به صورت خودکار به صفحه تزریق میشوند.
همچنین در اینجا فرض بر این است که Id منتسب به دومین جاری در کلیدی به نام GoogleAnalyticsID در فایل کانفیگ برنامه در قسمت app settings آن تعریف شده است.