❇️ تم های RTL زیبا و متنوع برای Bootstrap به صورت رایگان
🔸مشاهده Demo
https://mrjelveh.github.io/bootswatch-rtl/
🔹ریپازیتوری گیتهاب
https://github.com/mrjelveh/bootswatch-rtl
🔰تم های RTL بالا از روی نسخه های LTR اصلی اون ها که در زیر وجود دارند، برگردان شده اند
http://bootswatch.com/
https://github.com/thomaspark/bootswatch
___________________
@DotNetZoom
🔸مشاهده Demo
https://mrjelveh.github.io/bootswatch-rtl/
🔹ریپازیتوری گیتهاب
https://github.com/mrjelveh/bootswatch-rtl
🔰تم های RTL بالا از روی نسخه های LTR اصلی اون ها که در زیر وجود دارند، برگردان شده اند
http://bootswatch.com/
https://github.com/thomaspark/bootswatch
___________________
@DotNetZoom
Forwarded from کدهک
✅ آموزش Cache در Asp.Net Core (قسمت دوم : EasyCaching)
در دنیای امروز برنامه نویسی ، پکیج ها و فریمورک ها نقش بسیار مهمی را ایفا میکنند بطوری که در بسیاری ازین موارد استفاده از این پکیج ها عمل عاقلانه تری نسبت به دوباره نویسی فیچر های مربوطه است.
برای عمل کشینگ در Asp.Net Core نیز پکیج های فوقالعاده ای وجود دارد که در این مقاله به بررسی و استفاده از پکیج EasyCaching، یک پکیج محبوب و کاربردی برای پیاده سازی کش در Asp.Net Core میپردازیم.
همچنین جهت افزایش Performance از کتابخانه EasyCaching.Extensions.EasyCompressor که یک افزونه بر روی EasyCaching هست، استفاده میکنیم .این پکیج اطلاعات را قبل از کش شدن فشرده سازی میکند و حجم اطلاعات را به طور محسوسی کاهش میدهد که میزان فضای اشغالی Ram را کم کرده و همچنین عمل جابجایی اطلاعات را نیز تسریع میبخشد.
#سجاد_کاردل
https://vrgl.ir/SJlkR
پ.ن:
شخصا پیشنهاد میکنم به جای IMemoryCache و IDistributedCache ماکروسافت برای Caching از کتابخانه EasyCaching و در کنارش از EasyCompressor توی پروژه هاتون استفاده کنین (محمدجواد ابراهیمی)
__________________
@DotNetZoom
در دنیای امروز برنامه نویسی ، پکیج ها و فریمورک ها نقش بسیار مهمی را ایفا میکنند بطوری که در بسیاری ازین موارد استفاده از این پکیج ها عمل عاقلانه تری نسبت به دوباره نویسی فیچر های مربوطه است.
برای عمل کشینگ در Asp.Net Core نیز پکیج های فوقالعاده ای وجود دارد که در این مقاله به بررسی و استفاده از پکیج EasyCaching، یک پکیج محبوب و کاربردی برای پیاده سازی کش در Asp.Net Core میپردازیم.
همچنین جهت افزایش Performance از کتابخانه EasyCaching.Extensions.EasyCompressor که یک افزونه بر روی EasyCaching هست، استفاده میکنیم .این پکیج اطلاعات را قبل از کش شدن فشرده سازی میکند و حجم اطلاعات را به طور محسوسی کاهش میدهد که میزان فضای اشغالی Ram را کم کرده و همچنین عمل جابجایی اطلاعات را نیز تسریع میبخشد.
#سجاد_کاردل
https://vrgl.ir/SJlkR
پ.ن:
شخصا پیشنهاد میکنم به جای IMemoryCache و IDistributedCache ماکروسافت برای Caching از کتابخانه EasyCaching و در کنارش از EasyCompressor توی پروژه هاتون استفاده کنین (محمدجواد ابراهیمی)
__________________
@DotNetZoom
ویرگول
آموزش Cache در Asp.Net Core (قسمت دوم : EasyCaching)
در قسمت اول درمورد سیستم Cache دیفالت موجود در AspNet Core و مزیت ها و معایبش گفتیم اگر قسمت اول رو نخواندید پیشنهاد میکنم در همین پروفای…
✅ گنجینه ای ناب از کتاب های مختصر و مفید برنامه نویسی
به معنای واقعی کلمه یه گنجینه ناب هست! سال هاست ازش استفاده میکنم و خیلی راضی ام. بیش از 170 تا کتاب الکترونیکی رایگان داره تو انواع و اقسام موضوعات برنامه نویسی.
کتاباشم خیلی مختصر و مفید هست و اصلا طولانی و خسته کننده نیست، راست کار یه برنامه نویسایی که سرشون شلوغه. یعنی انتظار خیلی deep شدن رو نداشته باشین ولی اگه میخواین تو مدت زمان کمی به یه موضوع تسلط نسبی و یه دید کلی پیدا کنین بهترین گزینه اس.
https://www.syncfusion.com/ebooks/
____________________
@DotNetZoom
به معنای واقعی کلمه یه گنجینه ناب هست! سال هاست ازش استفاده میکنم و خیلی راضی ام. بیش از 170 تا کتاب الکترونیکی رایگان داره تو انواع و اقسام موضوعات برنامه نویسی.
کتاباشم خیلی مختصر و مفید هست و اصلا طولانی و خسته کننده نیست، راست کار یه برنامه نویسایی که سرشون شلوغه. یعنی انتظار خیلی deep شدن رو نداشته باشین ولی اگه میخواین تو مدت زمان کمی به یه موضوع تسلط نسبی و یه دید کلی پیدا کنین بهترین گزینه اس.
https://www.syncfusion.com/ebooks/
____________________
@DotNetZoom
✅ نمایش تعداد کاربران آنلاین در AspNet Core
برای محاسبه تعداد کاربران آنلاین اساسا دو روش وجود داره
1️⃣ روش اول - با استفاده از Cookie
در ASP.NET قدیم داخل کلاس global.asax متد هایی وجود داشت به نام Session_Start و Session_End که به هنگام شروع و پایان "سشن" کاربری، فراخوانی میشدن (با شی Session اشتباه گرفته نشود)
رخداد Session_Start زمانی raise یا اجرا میشد که یک سشن جدید برای یک کاربر ساخته بشه
و رخداد Session_End نیز زمانی raise میشد که یک سشن expire (منقضی) بشه
🔰مکانیزمی که سشن کاربری رو ایجاد ومنقضی میکرد، مراحلش به این صورت بود که:
▪️اولین بار که شخصی سایت رو باز میکرد، خود ASP.NET یک کوکی به نام "ASP.NET_SessionD" با مقدار یک "کلید تصادفی" به همراه Response برای کاربر میفرستاد و اون در مرورگر کاربر ذخیره میشد و از اون طرف همین "کلید تصادفی" در حافظه مموری سرور (به کمک شی Session) به عنوان شناسه یک کاربر (که شاید هنوز نمیدونیم کیه ولی میدونیم یه کاربره) ذخیره میشد (تا اینجای کار یک سشن برای کاربر جدید ساخته شده، در نتیجه رخداد Session_Start فراخوانی میشد)
▪️از درخواست های بعدی، این کوکی به همراه مقدارش (همون کلید تصادفی)، به Server ارسال میشد سپس ASP.NET این کلید رو میخوند و با مقادیر ذخیره شده در شی Session (در حافظه رم) مطابقت میداد و متوجه میشد که این همون کاربری هست که قبلا درخواست زده بود.
تایم منقضی شدن این سشن ها (session expire) به صورت پیشفرض 20 دقیقه بود و مادامی که درخواست یا بازدید از سمت همون کاربر میومد، این مدت زمان تمدید میشد.
در نتیجه مادامی که آخرین درخواست کاربر کمتر از 20 دقیقه قبل بود، سشن برقرار بود و زمانی که این مدت از 20 بیشتر میشد. اون سشن به صورت خودکار expire/منقضی میشد (در این مرحله رخداد Session_End فراخوانی میشد)
🔸بنابراین مادامی که کاربر ما، فاصله بین هر درخواستش کمتر از 20 دقیقه بود، سشن اون کاربر برقرار بود و یک کاربر "آنلاین" به حساب میومد
و زمانی که از آخرین درخواست کاربر، بیش از 20 دقیقه میگذشت، سشن کاربر منقضی شده و یک کاربر "آفلاین" به حساب میومد
در این حالت با کمی کد نویسی میشد تعداد کاربران آنلاین رو محاسبه کرد، به این صورت که یک متغیر global برای تعداد کاربران آنلاین در نظر میگرفتیم و به هنگام Session_Start اون رو ++ (یکی اضافه) و به هنگام Session_End اون رو -- (یکی کم) میکردیم
نکته: این توضیحات حالت پیشفرض هست، در صورت تنظیم sessionState میتونه محل ذخیره سازی سشن و کوکی در سمت سرور و کلاینت متفاوت باشه (مثلا ذخیره شدن سشن ها درون یک دیتابیس SqlServer به جای Memory یا تنظیم شدن کلید تصادفی درون URL به جای کوکی) - توضیحات بیشتر
🔹در ASP.NET Core اما این مکانیزم و این دو متد دیگه وجود نداره. پس مجبوریم مشابه همین مکانیزم رو خودمون کدنویسی و طراحی کنیم. کد نویسیش کار خاصی نداره، همین مراحل ساخت کوکی با یک "کلید تصادفی" (مثلا guid) و ذخیره اون علاوه بر Response، درون یک InMemory Cache داخل یک Middleware به سادگی انجام میشه
🔸در این روش چون فاصله زمانی 20 دقیقه رو برای session expire هست در نتیجه همیشه ما یک تلورانس و اختلاف 20 دقیقه ای ممکنه داشته باشیم. اگر کاربر جاری همین الان مرورگرش رو میبنده یا برق میره چون session اش تا 20 دقیقه از آخرین بازدیدش معتبر هست، همچنان تا 20 دقیقه آینده "آنلاین" محسوب میشه
2️⃣ روش دوم - با استفاده از ارتباطات Realtime مانند SignalR
🔹این روش خیلی مشابه روش قبل هست با این تفاوت که به محض برقرار شدن اتصال کاربر (رخداد OnConnectedAsync کلاس Hub) اون رو به عنوان کاربر آنلاین و به محض قطع شدن ارتباطش (رخداد OnDisconnectedAsync کلاس Hub) اون کاربر رو آفلاین در نظر میگیریم.
بقیه موارد ساخت کلید تصادفی و تنظیم کوکی جهت تشخیص کاربر از بقیه کاربر ها تقریبا مشابه قبل هست
🔸مزیت این روش اینه که دیگه ما تلورانس و اختلاف 20 دقیقه رو نخواهیم داشت و به صورت آنی و در لحظه تعداد کاربران آنلاین بروزرسانی خواهد شد
معایبش هم اینه که به دلیل استفاده از ارتباطات realtime پردازش بیشتری نسبت به روش اول روی سرور میوفته و یا اینکه امکان استفاده از ارتباطات realtime در برنامه شما به هر دلیل از جمله زیرساخت network یا محدودیت های سرور و application شما وجود نداشته باشه
🔹نکته آخر اینکه در اینجا سعی کردم مکانیزم خیلی ساده توضیح بدم اما پیاده سازی صحیح چنین مکانیزمی با توجه به امکان وقوع همزمانی مستلزم اینه که نکات پیشگیری از مشکلات همزمانی رعایت بشه
🔰در اینجا یک پروژه نمونه آماده کردم که هر دو این روش ها رو پیاده سازی کرده و میتونین با بررسی سورس کدش بیشتر با نحوه عملکرد اون آشنا بشین
https://github.com/dotnetzoom/OnlineUsers-AspNetCore
_________
@DotNetZoom
برای محاسبه تعداد کاربران آنلاین اساسا دو روش وجود داره
1️⃣ روش اول - با استفاده از Cookie
در ASP.NET قدیم داخل کلاس global.asax متد هایی وجود داشت به نام Session_Start و Session_End که به هنگام شروع و پایان "سشن" کاربری، فراخوانی میشدن (با شی Session اشتباه گرفته نشود)
رخداد Session_Start زمانی raise یا اجرا میشد که یک سشن جدید برای یک کاربر ساخته بشه
و رخداد Session_End نیز زمانی raise میشد که یک سشن expire (منقضی) بشه
🔰مکانیزمی که سشن کاربری رو ایجاد ومنقضی میکرد، مراحلش به این صورت بود که:
▪️اولین بار که شخصی سایت رو باز میکرد، خود ASP.NET یک کوکی به نام "ASP.NET_SessionD" با مقدار یک "کلید تصادفی" به همراه Response برای کاربر میفرستاد و اون در مرورگر کاربر ذخیره میشد و از اون طرف همین "کلید تصادفی" در حافظه مموری سرور (به کمک شی Session) به عنوان شناسه یک کاربر (که شاید هنوز نمیدونیم کیه ولی میدونیم یه کاربره) ذخیره میشد (تا اینجای کار یک سشن برای کاربر جدید ساخته شده، در نتیجه رخداد Session_Start فراخوانی میشد)
▪️از درخواست های بعدی، این کوکی به همراه مقدارش (همون کلید تصادفی)، به Server ارسال میشد سپس ASP.NET این کلید رو میخوند و با مقادیر ذخیره شده در شی Session (در حافظه رم) مطابقت میداد و متوجه میشد که این همون کاربری هست که قبلا درخواست زده بود.
تایم منقضی شدن این سشن ها (session expire) به صورت پیشفرض 20 دقیقه بود و مادامی که درخواست یا بازدید از سمت همون کاربر میومد، این مدت زمان تمدید میشد.
در نتیجه مادامی که آخرین درخواست کاربر کمتر از 20 دقیقه قبل بود، سشن برقرار بود و زمانی که این مدت از 20 بیشتر میشد. اون سشن به صورت خودکار expire/منقضی میشد (در این مرحله رخداد Session_End فراخوانی میشد)
🔸بنابراین مادامی که کاربر ما، فاصله بین هر درخواستش کمتر از 20 دقیقه بود، سشن اون کاربر برقرار بود و یک کاربر "آنلاین" به حساب میومد
و زمانی که از آخرین درخواست کاربر، بیش از 20 دقیقه میگذشت، سشن کاربر منقضی شده و یک کاربر "آفلاین" به حساب میومد
در این حالت با کمی کد نویسی میشد تعداد کاربران آنلاین رو محاسبه کرد، به این صورت که یک متغیر global برای تعداد کاربران آنلاین در نظر میگرفتیم و به هنگام Session_Start اون رو ++ (یکی اضافه) و به هنگام Session_End اون رو -- (یکی کم) میکردیم
نکته: این توضیحات حالت پیشفرض هست، در صورت تنظیم sessionState میتونه محل ذخیره سازی سشن و کوکی در سمت سرور و کلاینت متفاوت باشه (مثلا ذخیره شدن سشن ها درون یک دیتابیس SqlServer به جای Memory یا تنظیم شدن کلید تصادفی درون URL به جای کوکی) - توضیحات بیشتر
🔹در ASP.NET Core اما این مکانیزم و این دو متد دیگه وجود نداره. پس مجبوریم مشابه همین مکانیزم رو خودمون کدنویسی و طراحی کنیم. کد نویسیش کار خاصی نداره، همین مراحل ساخت کوکی با یک "کلید تصادفی" (مثلا guid) و ذخیره اون علاوه بر Response، درون یک InMemory Cache داخل یک Middleware به سادگی انجام میشه
🔸در این روش چون فاصله زمانی 20 دقیقه رو برای session expire هست در نتیجه همیشه ما یک تلورانس و اختلاف 20 دقیقه ای ممکنه داشته باشیم. اگر کاربر جاری همین الان مرورگرش رو میبنده یا برق میره چون session اش تا 20 دقیقه از آخرین بازدیدش معتبر هست، همچنان تا 20 دقیقه آینده "آنلاین" محسوب میشه
2️⃣ روش دوم - با استفاده از ارتباطات Realtime مانند SignalR
🔹این روش خیلی مشابه روش قبل هست با این تفاوت که به محض برقرار شدن اتصال کاربر (رخداد OnConnectedAsync کلاس Hub) اون رو به عنوان کاربر آنلاین و به محض قطع شدن ارتباطش (رخداد OnDisconnectedAsync کلاس Hub) اون کاربر رو آفلاین در نظر میگیریم.
بقیه موارد ساخت کلید تصادفی و تنظیم کوکی جهت تشخیص کاربر از بقیه کاربر ها تقریبا مشابه قبل هست
🔸مزیت این روش اینه که دیگه ما تلورانس و اختلاف 20 دقیقه رو نخواهیم داشت و به صورت آنی و در لحظه تعداد کاربران آنلاین بروزرسانی خواهد شد
معایبش هم اینه که به دلیل استفاده از ارتباطات realtime پردازش بیشتری نسبت به روش اول روی سرور میوفته و یا اینکه امکان استفاده از ارتباطات realtime در برنامه شما به هر دلیل از جمله زیرساخت network یا محدودیت های سرور و application شما وجود نداشته باشه
🔹نکته آخر اینکه در اینجا سعی کردم مکانیزم خیلی ساده توضیح بدم اما پیاده سازی صحیح چنین مکانیزمی با توجه به امکان وقوع همزمانی مستلزم اینه که نکات پیشگیری از مشکلات همزمانی رعایت بشه
🔰در اینجا یک پروژه نمونه آماده کردم که هر دو این روش ها رو پیاده سازی کرده و میتونین با بررسی سورس کدش بیشتر با نحوه عملکرد اون آشنا بشین
https://github.com/dotnetzoom/OnlineUsers-AspNetCore
_________
@DotNetZoom
Telegram
Attach Files
Forwarded from Software Philosophy
معرفی System.Threading.Channels
فرض کنید سیستم ایمیل مارکتینگ شما قرار است یک میلیون کاربر را در حافظه لود کند و سپس برای همهی آنها ایمیل ارسال کند. از زمانی که شما این کاربرها را از دیتابیس لود میکنید هزینه بالایی بابت کوئری سنگین متحمل میشوید و همچنین بعد از لود کردن هم نگهداری این تعداد در حافظه باعث اشغال شدن مقدار زیادی از حافظه میشود. (هر چند عملیات با موفقیت انجام میشود ولی بهینه نیست!)
از طرفی هم اگر بخواهید مثلا هزار تا هزار تا این داده ها را لود و ارسال کنید، سرعت عملیات پایین میآید.
بهینه ترین روش ایجاد سیستمی است که همانند چرخه تولید به مصرف عمل کند. یعنی مصرف کننده داده صرفا دادههایی را از یک صف تعریف شده میگیرد و قسمت تولید کننده داده هم با استراتژی خاصی دادهها را تولید (از دیتابیس لود میکند) و داخل صف قرار میدهد و هر موقع کارش به اتمام رسید به مصرف کننده اعلام میکند تا دیگر منتظر صف نماند.
در اینجا چالشهای زیادی مطرح میشود که در System.Threading.Channels این چالشها مد نظر قرار گرفته شده است که برنامه نویس میتواند بر روی چنل (صف) داده قرار دهد (Write) و یا در جای دیگری از دادههای صف استفاده کند (Read).
افزودن داده بر روی چنل
https://virgool.io/@hamedhajiloo96/system-threading-channels-z1kx0mctp7gp
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، برروی دکمه «نظرت را بگو» کلیک کنید.
#حامد_حاجیلو (http://bit.ly/2IVjfYD)
کانال تلگرام:
@SoftwarePhilosophy
________
فرض کنید سیستم ایمیل مارکتینگ شما قرار است یک میلیون کاربر را در حافظه لود کند و سپس برای همهی آنها ایمیل ارسال کند. از زمانی که شما این کاربرها را از دیتابیس لود میکنید هزینه بالایی بابت کوئری سنگین متحمل میشوید و همچنین بعد از لود کردن هم نگهداری این تعداد در حافظه باعث اشغال شدن مقدار زیادی از حافظه میشود. (هر چند عملیات با موفقیت انجام میشود ولی بهینه نیست!)
از طرفی هم اگر بخواهید مثلا هزار تا هزار تا این داده ها را لود و ارسال کنید، سرعت عملیات پایین میآید.
بهینه ترین روش ایجاد سیستمی است که همانند چرخه تولید به مصرف عمل کند. یعنی مصرف کننده داده صرفا دادههایی را از یک صف تعریف شده میگیرد و قسمت تولید کننده داده هم با استراتژی خاصی دادهها را تولید (از دیتابیس لود میکند) و داخل صف قرار میدهد و هر موقع کارش به اتمام رسید به مصرف کننده اعلام میکند تا دیگر منتظر صف نماند.
در اینجا چالشهای زیادی مطرح میشود که در System.Threading.Channels این چالشها مد نظر قرار گرفته شده است که برنامه نویس میتواند بر روی چنل (صف) داده قرار دهد (Write) و یا در جای دیگری از دادههای صف استفاده کند (Read).
افزودن داده بر روی چنل
await channel.Writer.WriteAsync(item);خواندن داده از چنل
channel.Reader.ReadAllAsync()توضیحات تکمیلی را اینجا بخوانید:
https://virgool.io/@hamedhajiloo96/system-threading-channels-z1kx0mctp7gp
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، برروی دکمه «نظرت را بگو» کلیک کنید.
#حامد_حاجیلو (http://bit.ly/2IVjfYD)
کانال تلگرام:
@SoftwarePhilosophy
________
ویرگول
معرفی System.Threading.Channels
معرفی سیستمی جهت پیاده سازی بهینه و ایمن صف Queue در برنامه نویسی
❇️ نمونه معماری پیاده سازی شده با ASP.NET Core و Angular و DDD
مناسب جهت Code Review و ایده برداری
✔️.NET 5
✔️ASP.NET Core 5
✔️Entity Framework Core 5
✔️C# 9
✔️#Angular 11
✔️#UIkit
✔️#Clean_Code
✔️#Clean_Architecture
✔️#SOLID
✔️#DDD
🔰لینک مخزن گیتهاب
https://github.com/rafaelfgx/Architecture
___________________
@DotNetZoom
مناسب جهت Code Review و ایده برداری
Architecture .NET 5, ASP.NET Core 5, Entity Framework Core 5, C# 9, Angular 11, Clean Code, SOLID, DDD.
تکنولوژی ها و تکنیک های استفاده شده: ✔️.NET 5
✔️ASP.NET Core 5
✔️Entity Framework Core 5
✔️C# 9
✔️#Angular 11
✔️#UIkit
✔️#Clean_Code
✔️#Clean_Architecture
✔️#SOLID
✔️#DDD
🔰لینک مخزن گیتهاب
https://github.com/rafaelfgx/Architecture
___________________
@DotNetZoom
GitHub
GitHub - rafaelfgx/Architecture: .NET, Angular, Clean Architecture, Clean Code, SOLID Principles, KISS Principle, DRY Principle…
.NET, Angular, Clean Architecture, Clean Code, SOLID Principles, KISS Principle, DRY Principle, Fail Fast Principle, Common Closure Principle, Common Reuse Principle, Acyclic Dependencies Principle...
✅ لاگ کردن جزئیات Request ها به کمک Serilog و ActionFilter
بعضی وقتا پیش میاد لازم دارید اطلاعات هر درخواست ورودی Action هامون رو به همراه جزئیات کاملشون رو جهت عیب یابی یا بررسی های آتی ثبت و Log کنیم
در اینجا یک نمونه پروژه آماده کردم که این کار رو به راحتی قرار دادن یک اتریبیوت [LogRequest] بر روی اکشن های مورد نظر انجام میده یا میتونین روی Controller یا به صورت Global ثبت اش کنین تا همه اکشن ها رو Log کنه
🔸طرز کارش به این صورته که در درون ActionFilter مذکور (LogRequest)، جزئیات لازم رو قبل و بعد از اجرا شدن Action مورد نظر Log میکنه (بنا بر نیازتون میتونین هر دیتای دلخواه دیگه ای رو هم از request و response بهش اضافه کنین)
و نهایتا برای ذخیره سازی لاگ ها هم از Serilog و از SqlServer به عنوان Sinks استفاده میکنه (در صورت دلخواه میتونین تو هر Storage/Sink دیگه ای ذخیره کنین)
🔹مسلما لاگ کردن همه درخواست ها میتونه سربار داشته باشه و شخصا پیشنهاد نیمکنم همیشه و همه جا ازش استفاده کنین ولی نکته ای که در مورد Sink های Serilog وجود داره اینه که اکثرا از Async و PeriodicBatching استفاده میکنن به این صورت که در بازه های زمانی Log ها رو به صورت Bulk ایی Insert میکنن (اونم به صورت Async که Thread ایی رو بلاک نکنن) در نتیجه از نظر پرفرمنسی در حالت بهینه ای کار میکنن
🔰از جمله جزئیاتی که در هر درخواست Log میکنه:
1- آدرس URL درخواستی به همراه مقادیر QueryString
2- مقادیر Header های Request و Response
3- مقادیر ارسالی از سمت کاربر (آرگومان های Action)
4- وضعیت ModelState به همراه Error Message ها در صورت وجود
5- مقادیر Routing بسته به Route مچ شده
6- مقادیر شی User.Identity از جمله Claim ها، Name و IsAuthenticated
7- مقدار IP Address کاربر
8- مقدار Url Referrer (آدرس هدایت کننده قبلی به این صفحه)
9- مدت زمان پردازش درخواست جاری (Elapsed Time) و زمان ثبت درخواست
10- جزئیات Exception در صورت وقوع خطا
11- وضعیت Http Status Code درخواست
12- و...
https://github.com/dotnetzoom/RequestLogger-AspNetCore
____________________
@DotNetZoom
بعضی وقتا پیش میاد لازم دارید اطلاعات هر درخواست ورودی Action هامون رو به همراه جزئیات کاملشون رو جهت عیب یابی یا بررسی های آتی ثبت و Log کنیم
در اینجا یک نمونه پروژه آماده کردم که این کار رو به راحتی قرار دادن یک اتریبیوت [LogRequest] بر روی اکشن های مورد نظر انجام میده یا میتونین روی Controller یا به صورت Global ثبت اش کنین تا همه اکشن ها رو Log کنه
🔸طرز کارش به این صورته که در درون ActionFilter مذکور (LogRequest)، جزئیات لازم رو قبل و بعد از اجرا شدن Action مورد نظر Log میکنه (بنا بر نیازتون میتونین هر دیتای دلخواه دیگه ای رو هم از request و response بهش اضافه کنین)
و نهایتا برای ذخیره سازی لاگ ها هم از Serilog و از SqlServer به عنوان Sinks استفاده میکنه (در صورت دلخواه میتونین تو هر Storage/Sink دیگه ای ذخیره کنین)
🔹مسلما لاگ کردن همه درخواست ها میتونه سربار داشته باشه و شخصا پیشنهاد نیمکنم همیشه و همه جا ازش استفاده کنین ولی نکته ای که در مورد Sink های Serilog وجود داره اینه که اکثرا از Async و PeriodicBatching استفاده میکنن به این صورت که در بازه های زمانی Log ها رو به صورت Bulk ایی Insert میکنن (اونم به صورت Async که Thread ایی رو بلاک نکنن) در نتیجه از نظر پرفرمنسی در حالت بهینه ای کار میکنن
🔰از جمله جزئیاتی که در هر درخواست Log میکنه:
1- آدرس URL درخواستی به همراه مقادیر QueryString
2- مقادیر Header های Request و Response
3- مقادیر ارسالی از سمت کاربر (آرگومان های Action)
4- وضعیت ModelState به همراه Error Message ها در صورت وجود
5- مقادیر Routing بسته به Route مچ شده
6- مقادیر شی User.Identity از جمله Claim ها، Name و IsAuthenticated
7- مقدار IP Address کاربر
8- مقدار Url Referrer (آدرس هدایت کننده قبلی به این صفحه)
9- مدت زمان پردازش درخواست جاری (Elapsed Time) و زمان ثبت درخواست
10- جزئیات Exception در صورت وقوع خطا
11- وضعیت Http Status Code درخواست
12- و...
https://github.com/dotnetzoom/RequestLogger-AspNetCore
____________________
@DotNetZoom
Forwarded from کدهک
✅ معرفی REST API Guideline شرکت های بزرگ + Best Practice ها
🔸Microsoft REST API Guidelines
🔹Microsoft Best Practices for Web API design
🔸Microsoft Best Practices for Web API implementation
🔹Google API Design Guide
🔸PayPal API Design Guidelines
🔸Stackoverflow Best practices for REST API design
🔸Best Practices for Designing a Pragmatic RESTful API
__________________
@DotNetZoom
🔸Microsoft REST API Guidelines
🔹Microsoft Best Practices for Web API design
🔸Microsoft Best Practices for Web API implementation
🔹Google API Design Guide
🔸PayPal API Design Guidelines
🔸Stackoverflow Best practices for REST API design
🔸Best Practices for Designing a Pragmatic RESTful API
__________________
@DotNetZoom
Forwarded from کدهک
ویژوال استودیو 2022 به طور کامل از پردازنده های 64 بیتی پشتیبانی میکند و محدودیت حافظه 4 گیگابایتی آن روی devenv.exe برطرف شده است. به این ترتیب امکان باز کردن سولوشن هایی با هزاران پروژه و چند صد هزار فایل ممکن شده است.
این نسخه قرار است از MAUI هم پشتیبانی کند وامکان پیاده سازی اپ های با UI یکسان در انواع پلتفرم ها را فراهم میکند.
پیش بینی میشود نسخه 22 به همراه دات نت 6 در اواخر سال جاری میلادی منتشر شود.
این نسخه قرار است از MAUI هم پشتیبانی کند وامکان پیاده سازی اپ های با UI یکسان در انواع پلتفرم ها را فراهم میکند.
پیش بینی میشود نسخه 22 به همراه دات نت 6 در اواخر سال جاری میلادی منتشر شود.
✅ پنجمین گفتگوی فنی #فری_تاک
با موضوع : تکنیک Caching و روش های مختلف آن
سه شنبه 7 اردیبهشت، ساعت 21:00
با حضور محمدجواد ابراهیمی و معین تاجیک
#فری_تاک یک گفتگوی فنی در مورد توسعه نرم افزار (بیشتر متمرکز بر دات نت) هست که هر هفته سه شنبه ها ساعت 21:00 برگزار میشه
این گفتگو صوتی هست و توسط قابلیت Voice Chat تلگرام (چیزی شبیه به Clubhouse یا Spaces توئیتر) در همین کانال برگزار میشه
ویس جلسات گفتگو ضبط شده و در آخر همینجا منتشر خواهد شد
جهت استفاده از قابلیت Voice Chat از آپدیت بودن تلگرامتون اطمینان حاصل کنین.
سه شنبه ساعت 21:00 منتظرتون هستیم
_______________
@DotNetZoom
با موضوع : تکنیک Caching و روش های مختلف آن
سه شنبه 7 اردیبهشت، ساعت 21:00
با حضور محمدجواد ابراهیمی و معین تاجیک
#فری_تاک یک گفتگوی فنی در مورد توسعه نرم افزار (بیشتر متمرکز بر دات نت) هست که هر هفته سه شنبه ها ساعت 21:00 برگزار میشه
این گفتگو صوتی هست و توسط قابلیت Voice Chat تلگرام (چیزی شبیه به Clubhouse یا Spaces توئیتر) در همین کانال برگزار میشه
ویس جلسات گفتگو ضبط شده و در آخر همینجا منتشر خواهد شد
جهت استفاده از قابلیت Voice Chat از آپدیت بودن تلگرامتون اطمینان حاصل کنین.
سه شنبه ساعت 21:00 منتظرتون هستیم
_______________
@DotNetZoom
✅ سری آموزش چند مستاجری (Multi-Tenant) در ASP .NET Core
معماری چند مستاجری یا Multi Tenant به معماری گفته میشه که در اون "یک" نسخه از برنامه قادر هست به چندین Tenant (مستاجر) خدمات ارائه بده مثلا سایت های ارائه وبلاگ که هر کس میتونه وبلاگ خودش رو داشته باشه ولی اینطور نیست که به ازای هر دارنده وبلاگ، یه نسخه مجزا از وبسایت و دیتابیس رو براش لانچ کنن. یا مثلا یک فروشگاه Market Place که هر کس میتونه فروشگاه خودش رو داشته باشه ولی همگی از یک نسخه از وبسایت و دیتابیس تغذیه میکنن.
استراتژی های مختلفی هم برای طراحی دیتابیس اش وجود داره. که هر کدوم مزایا و معایب خودشون رو دارن. مثلا :
دیتابیس مجزا به ازای هر tenant
یک دیتابیس مشترک ولی scheme مجزا به ازای هر tenant
یا دیتابیس و scheme مشترک ولی جدا سازی اطلاعات بر اساس سطر های جداول
در اینجا سعی کردم لیستی از منابع آموزشی این معماری رو براتون تهیه کنم
🔸آموزش های تکی
✔️ معماری پایگاه داده چند مستاجری (Multi-Tenant Data Architecture)
✔️ پیاده سازی برنامههای چند مستاجری در ASP.NET Core
✔️Writing Multitenant ASP.NET Core Applications
✔️Building Multi-Tenant Applications Using ASP.NET 5
🔹سری 8 قسمتی از Gunnar Peipman
1️⃣ Global query filters in Entity Framework Core 2.0
2️⃣ Implementing tenant providers on ASP.NET Core
3️⃣ Implementing database per tenant strategy on ASP.NET Core
4️⃣ Handling missing tenants in ASP.NET Core
5️⃣ Unit testing multi-tenant database provider
6️⃣ Defensive database context for multi-tenant ASP.NET Core applications
7️⃣ Tenant-based dependency injection in multi-tenant ASP.NET Core applications
8️⃣ Using configurable composite command in multi-tenant ASP.NET Core application
🔸سری 4 قسمتی از Carl Rippon
1️⃣ Creating a Multi-Tenant ASP.NET Core Web API with SQL Server RLS
2️⃣ Creating a Multi-Tenant ASP.NET Core Web API with Dapper and SQL RLS
3️⃣ Integration Testing on ASP.NET Core Web API controllers with a SQL backend
4️⃣ ASP.NET Core Web API Multi-Tenant JWTs
🔹سری 5 قسمتی از Michael McKenna
1️⃣ Creating a multi-tenant .NET Core Application - Tenant resolution
2️⃣ Creating a multi-tenant .NET Core Application - Tenant containers
3️⃣ Creating a multi-tenant .NET Core Application - Tenant specific options
4️⃣ Creating a multi-tenant .NET Core Application - Tenant specific authentication
5️⃣ Migrating multi-tenancy to .NET Core 3.1 (LTS)
🔰بهترین فریمورک های Multi-Tenant
✔️ https://github.com/Finbuckle/Finbuckle.MultiTenant
✔️ https://github.com/cloudscribe/cloudscribe
✔️ https://github.com/OrchardCMS/OrchardCore
✔️ https://github.com/aspnetboilerplate/aspnetboilerplate
__________________
@DotNetZoom
معماری چند مستاجری یا Multi Tenant به معماری گفته میشه که در اون "یک" نسخه از برنامه قادر هست به چندین Tenant (مستاجر) خدمات ارائه بده مثلا سایت های ارائه وبلاگ که هر کس میتونه وبلاگ خودش رو داشته باشه ولی اینطور نیست که به ازای هر دارنده وبلاگ، یه نسخه مجزا از وبسایت و دیتابیس رو براش لانچ کنن. یا مثلا یک فروشگاه Market Place که هر کس میتونه فروشگاه خودش رو داشته باشه ولی همگی از یک نسخه از وبسایت و دیتابیس تغذیه میکنن.
استراتژی های مختلفی هم برای طراحی دیتابیس اش وجود داره. که هر کدوم مزایا و معایب خودشون رو دارن. مثلا :
دیتابیس مجزا به ازای هر tenant
یک دیتابیس مشترک ولی scheme مجزا به ازای هر tenant
یا دیتابیس و scheme مشترک ولی جدا سازی اطلاعات بر اساس سطر های جداول
در اینجا سعی کردم لیستی از منابع آموزشی این معماری رو براتون تهیه کنم
🔸آموزش های تکی
✔️ معماری پایگاه داده چند مستاجری (Multi-Tenant Data Architecture)
✔️ پیاده سازی برنامههای چند مستاجری در ASP.NET Core
✔️Writing Multitenant ASP.NET Core Applications
✔️Building Multi-Tenant Applications Using ASP.NET 5
🔹سری 8 قسمتی از Gunnar Peipman
1️⃣ Global query filters in Entity Framework Core 2.0
2️⃣ Implementing tenant providers on ASP.NET Core
3️⃣ Implementing database per tenant strategy on ASP.NET Core
4️⃣ Handling missing tenants in ASP.NET Core
5️⃣ Unit testing multi-tenant database provider
6️⃣ Defensive database context for multi-tenant ASP.NET Core applications
7️⃣ Tenant-based dependency injection in multi-tenant ASP.NET Core applications
8️⃣ Using configurable composite command in multi-tenant ASP.NET Core application
🔸سری 4 قسمتی از Carl Rippon
1️⃣ Creating a Multi-Tenant ASP.NET Core Web API with SQL Server RLS
2️⃣ Creating a Multi-Tenant ASP.NET Core Web API with Dapper and SQL RLS
3️⃣ Integration Testing on ASP.NET Core Web API controllers with a SQL backend
4️⃣ ASP.NET Core Web API Multi-Tenant JWTs
🔹سری 5 قسمتی از Michael McKenna
1️⃣ Creating a multi-tenant .NET Core Application - Tenant resolution
2️⃣ Creating a multi-tenant .NET Core Application - Tenant containers
3️⃣ Creating a multi-tenant .NET Core Application - Tenant specific options
4️⃣ Creating a multi-tenant .NET Core Application - Tenant specific authentication
5️⃣ Migrating multi-tenancy to .NET Core 3.1 (LTS)
🔰بهترین فریمورک های Multi-Tenant
✔️ https://github.com/Finbuckle/Finbuckle.MultiTenant
✔️ https://github.com/cloudscribe/cloudscribe
✔️ https://github.com/OrchardCMS/OrchardCore
✔️ https://github.com/aspnetboilerplate/aspnetboilerplate
__________________
@DotNetZoom
.NET Tips
معماری پایگاه داده چند مستاجری (Multi-Tenant Data Architecture)
اعتماد و یا فقدان آن، عامل شماره یک مسدود کردن استفاده از نرم افزار به عنوان خدمات است. معماری پایگاه داده چند مستاجری برای رسیدگی به مشکل نرم افزار به عنوان سرویس (SaaS) که میتواند خدمات به تعدادی کلاینت ارائه کند استفاده میشود . معماری دیتابیس چند مستاجری…
DotNetZoom
✅ پنجمین گفتگوی فنی #فری_تاک با موضوع : تکنیک Caching و روش های مختلف آن سه شنبه 7 اردیبهشت، ساعت 21:00 با حضور محمدجواد ابراهیمی و معین تاجیک #فری_تاک یک گفتگوی فنی در مورد توسعه نرم افزار (بیشتر متمرکز بر دات نت) هست که هر هفته سه شنبه ها ساعت 21:00 برگزار…
✅ گفتگوی فنی #فری_تاک با موضوع Caching شروع شد 👋
DotNetZoom
DotNetZoom – Caching
✅ مباحث و کلمات کلیدی ایی که در این جلسه از #فری_تاک در موردشون صحبت کردیم
- کش چیه؟
- اهمیتش Cache و اینکه کجاها استفاده میشه؟
- چه چیزایی رو کش کنیم و چه چیزایی رو نه؟
- روش های کشینگ
- Data Caching
- In-Memory
- Distributed
- BackPlane/Hybrid Cache
- Http Response Caching
- Varnish (Caching HTTP reverse proxy)
- Cache Invalidation
- Caching Libraries in .NET
- EasyCaching
- CacheManager
- IMemoryCache
- IDistributedCache (SqlServer, StackExchangeRedis)
- EFCoreSecondLevelCacheInterceptor
- Redis vs Memcached
- Single Thread vs Multi thread
- Data Structures
- Streaming
- Pub/Sub
- HA/Clustering
- Caching/Redis Best Practices
- Avoid Large Values
- Avoid Long Keys
- Avoid No TTL Keys (infinite)
- Serialization
- MessagePack
- Protobuf
- Newtonsoft.Json
- System.Text.Json
- Compression
- EasyCompressor
- LZ4
- Zstd
- GZip/Deflate
- Brotli
- Redis GUI Management
- Redis Desktop Manager
- RedisInsight
- Another Redis Desktop Manager
- کش چیه؟
- اهمیتش Cache و اینکه کجاها استفاده میشه؟
- چه چیزایی رو کش کنیم و چه چیزایی رو نه؟
- روش های کشینگ
- Data Caching
- In-Memory
- Distributed
- BackPlane/Hybrid Cache
- Http Response Caching
- Varnish (Caching HTTP reverse proxy)
- Cache Invalidation
- Caching Libraries in .NET
- EasyCaching
- CacheManager
- IMemoryCache
- IDistributedCache (SqlServer, StackExchangeRedis)
- EFCoreSecondLevelCacheInterceptor
- Redis vs Memcached
- Single Thread vs Multi thread
- Data Structures
- Streaming
- Pub/Sub
- HA/Clustering
- Caching/Redis Best Practices
- Avoid Large Values
- Avoid Long Keys
- Avoid No TTL Keys (infinite)
- Serialization
- MessagePack
- Protobuf
- Newtonsoft.Json
- System.Text.Json
- Compression
- EasyCompressor
- LZ4
- Zstd
- GZip/Deflate
- Brotli
- Redis GUI Management
- Redis Desktop Manager
- RedisInsight
- Another Redis Desktop Manager
Forwarded from DotNetZoom (محمد جواد ابراهیمی)
✅ یک #نکته - آزاد سازی فضای درایو C با حذف پکیج های Nuget اضافی
وقتی یه پکیچ nuget رو نصب میکنید اون رو توی یه پوشه ای به ازای کاربری جاری سیستم عامل ذخیره میکنه (کش میکنه)
این باعث میشه که دفعات بعدی که اون پکیچ رو لازم دارید دیگه از اینترنت دانلود نکته و از کش شما بخونه. البته اگر ورژن جدید تری اومده باشه که توی پوشه کش شما وجود نداشته باشه اون رو دانلود میکنه و به لیست ورژن های قبلی ایی که داشتین اضافه میکنیه
این عمل خیلی خوبه و باعث میشه معمولا پکیج های اضافه دانلود نکنین و از کش نصب میکنه پس سرعت restore شدن پکیج ها خیلی بالا میره ولی در طولانی مدت باعث میشه حجم خیلی زیادی اشغال کنه. مثلا من که سالی 12 ماه ویندوز عوض نمیکنم و پکیج ها و ورژن های زیادی توی سیستمم ذخیره شده بود یه چند مدتی بود که فضای درایو C ایم کم بیاد و الان که این پوشه رو چک کردم بیش از 10 گیگابایت حجم داشت!
🔰واسه حذف این پکیج ها 2تا راه وجود داره:
1️⃣ مسیر زیر روی توی آدرس بار بزنین و دستی اون پوشه رو حذف کنین
%userprofile%\.nuget\packages
2️⃣ ویژوال استادیو رو باز کنین و از منو Tools به مسیر زیر برین (مانند تصویر)
Tools > NuGet Package Manager > General
و سپس دکمه Clear All NuGet Cache(s) رو بزنین. (ممکنه واسه چند لحظه هنگ کنه برنامه)
🔸این حذف کردن هیچ مشکلی هم براتون به وجود نمیاره فقط اگر پکیج هاتون شناسایی نشد رو Solution راست کلیک کنین و گزینه Restore Nuget Packages رو بزنین یا توسط NET Core CLI. دستور dotnet restore رو پروژه/سلشون تون اجرا کنین (این کار برای بار اول کمی زمان میبره تا همه رو دانلود کنه - یادتون نره یه بارم VS رو باز و بسته کنین)
___________________
@DotNetZoom
وقتی یه پکیچ nuget رو نصب میکنید اون رو توی یه پوشه ای به ازای کاربری جاری سیستم عامل ذخیره میکنه (کش میکنه)
این باعث میشه که دفعات بعدی که اون پکیچ رو لازم دارید دیگه از اینترنت دانلود نکته و از کش شما بخونه. البته اگر ورژن جدید تری اومده باشه که توی پوشه کش شما وجود نداشته باشه اون رو دانلود میکنه و به لیست ورژن های قبلی ایی که داشتین اضافه میکنیه
این عمل خیلی خوبه و باعث میشه معمولا پکیج های اضافه دانلود نکنین و از کش نصب میکنه پس سرعت restore شدن پکیج ها خیلی بالا میره ولی در طولانی مدت باعث میشه حجم خیلی زیادی اشغال کنه. مثلا من که سالی 12 ماه ویندوز عوض نمیکنم و پکیج ها و ورژن های زیادی توی سیستمم ذخیره شده بود یه چند مدتی بود که فضای درایو C ایم کم بیاد و الان که این پوشه رو چک کردم بیش از 10 گیگابایت حجم داشت!
🔰واسه حذف این پکیج ها 2تا راه وجود داره:
1️⃣ مسیر زیر روی توی آدرس بار بزنین و دستی اون پوشه رو حذف کنین
%userprofile%\.nuget\packages
2️⃣ ویژوال استادیو رو باز کنین و از منو Tools به مسیر زیر برین (مانند تصویر)
Tools > NuGet Package Manager > General
و سپس دکمه Clear All NuGet Cache(s) رو بزنین. (ممکنه واسه چند لحظه هنگ کنه برنامه)
🔸این حذف کردن هیچ مشکلی هم براتون به وجود نمیاره فقط اگر پکیج هاتون شناسایی نشد رو Solution راست کلیک کنین و گزینه Restore Nuget Packages رو بزنین یا توسط NET Core CLI. دستور dotnet restore رو پروژه/سلشون تون اجرا کنین (این کار برای بار اول کمی زمان میبره تا همه رو دانلود کنه - یادتون نره یه بارم VS رو باز و بسته کنین)
___________________
@DotNetZoom
Telegram
Attach Files
❇️ معرفی پروژه فروشگاهی eShopOnWeb جهت Code Review و ایده برداری
به همراه eBook آموزشی به صورت PDF
✔️.NET 5
✔️ASP.NET Core 5
✔️Entity Framework Core 5
✔️#Monolith
✔️#Clean_Architecture
✔️#DDD
✔️#Design_Patterns
🔰لینک مخزن گیتهاب
https://github.com/dotnet-architecture/eShopOnWeb
▪️پروژه eShopOnContainers که نسخه Microservices همین پروژه هست قبلا در کانال معرفی شده
____________________
@DotNetZoom
به همراه eBook آموزشی به صورت PDF
Sample ASP.NET Core 5.0 reference application, powered by Microsoft, demonstrating a layered application architecture with monolithic deployment model. Download the eBook PDF from docs folder.تکنولوژی ها و تکنیک های استفاده شده:
✔️.NET 5
✔️ASP.NET Core 5
✔️Entity Framework Core 5
✔️#Monolith
✔️#Clean_Architecture
✔️#DDD
✔️#Design_Patterns
🔰لینک مخزن گیتهاب
https://github.com/dotnet-architecture/eShopOnWeb
▪️پروژه eShopOnContainers که نسخه Microservices همین پروژه هست قبلا در کانال معرفی شده
____________________
@DotNetZoom
GitHub
GitHub - dotnet-architecture/eShopOnWeb: Sample ASP.NET Core 8.0 reference application, now community supported: https://githu…
Sample ASP.NET Core 8.0 reference application, now community supported: https://github.com/NimblePros/eShopOnWeb - dotnet-architecture/eShopOnWeb
✅ ششمین گفتگوی فنی #فری_تاک
با موضوع : CQRS
سه شنبه 14 اردیبهشت، ساعت 21:00
ارائه دهندگان: محمدجواد ابراهیمی - معین تاجیک
#فری_تاک یک گفتگوی فنی در مورد توسعه نرم افزار (بیشتر متمرکز بر دات نت) هست که هر هفته سه شنبه ها ساعت 21:00 برگزار میشه
این گفتگو صوتی هست و توسط قابلیت Voice Chat تلگرام (چیزی شبیه به Clubhouse یا Spaces توئیتر) در همین کانال برگزار میشه
ویس جلسات گفتگو ضبط شده و در آخر همینجا منتشر خواهد شد
جهت استفاده از قابلیت Voice Chat از آپدیت بودن تلگرامتون اطمینان حاصل کنین.
ویس ضبط شده جلسات رو میتونین با هشتگ #فری_تاک پیدا کنین.
___________________
@DotNetZoom
با موضوع : CQRS
سه شنبه 14 اردیبهشت، ساعت 21:00
ارائه دهندگان: محمدجواد ابراهیمی - معین تاجیک
#فری_تاک یک گفتگوی فنی در مورد توسعه نرم افزار (بیشتر متمرکز بر دات نت) هست که هر هفته سه شنبه ها ساعت 21:00 برگزار میشه
این گفتگو صوتی هست و توسط قابلیت Voice Chat تلگرام (چیزی شبیه به Clubhouse یا Spaces توئیتر) در همین کانال برگزار میشه
ویس جلسات گفتگو ضبط شده و در آخر همینجا منتشر خواهد شد
جهت استفاده از قابلیت Voice Chat از آپدیت بودن تلگرامتون اطمینان حاصل کنین.
ویس ضبط شده جلسات رو میتونین با هشتگ #فری_تاک پیدا کنین.
___________________
@DotNetZoom