Get Mystery Box with random crypto!

DotNetZoom

لوگوی کانال تلگرام dotnetzoom — DotNetZoom D
لوگوی کانال تلگرام dotnetzoom — DotNetZoom
آدرس کانال: @dotnetzoom
دسته بندی ها: فن آوری ها
زبان: فارسی
مشترکین: 3.62K
توضیحات از کانال

✅ DotNetZoom
💎 Everything about .NET
ارتباط با مدیر و تبلیغات آگهی استخدام:
@mjebrahimi
لینک گروه ASPNET Core:
https://t.me/ ufG25x7lVFgyYTNk

Ratings & Reviews

4.50

2 reviews

Reviews can be left only by registered users. All reviews are moderated by admins.

5 stars

1

4 stars

1

3 stars

0

2 stars

0

1 stars

0


آخرین پیام ها 11

2021-04-26 22:07:12 سری آموزش چند مستاجری (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
Global query filters in Entity Framework Core 2.0
Implementing tenant providers on ASP.NET Core
Implementing database per tenant strategy on ASP.NET Core
Handling missing tenants in ASP.NET Core
Unit testing multi-tenant database provider
Defensive database context for multi-tenant ASP.NET Core applications
Tenant-based dependency injection in multi-tenant ASP.NET Core applications
Using configurable composite command in multi-tenant ASP.NET Core application

سری 4 قسمتی از Carl Rippon
Creating a Multi-Tenant ASP.NET Core Web API with SQL Server RLS
Creating a Multi-Tenant ASP.NET Core Web API with Dapper and SQL RLS
Integration Testing on ASP.NET Core Web API controllers with a SQL backend
ASP.NET Core Web API Multi-Tenant JWTs

سری 5 قسمتی از Michael McKenna
Creating a multi-tenant .NET Core Application - Tenant resolution
Creating a multi-tenant .NET Core Application - Tenant containers
Creating a multi-tenant .NET Core Application - Tenant specific options
Creating a multi-tenant .NET Core Application - Tenant specific authentication
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
844 viewsAli Abdolmaleki, 19:07
باز کردن / نظر دهید
2021-04-25 14:11:10
پنجمین گفتگوی فنی #فری_تاک
با موضوع : تکنیک Caching و روش های مختلف آن
سه شنبه 7 اردیبهشت، ساعت 21:00
با حضور محمدجواد ابراهیمی و معین تاجیک

#فری_تاک یک گفتگوی فنی در مورد توسعه نرم افزار (بیشتر متمرکز بر دات نت) هست که هر هفته سه شنبه ها ساعت 21:00 برگزار میشه
این گفتگو صوتی هست و توسط قابلیت Voice Chat تلگرام (چیزی شبیه به Clubhouse یا Spaces توئیتر) در همین کانال برگزار میشه
ویس جلسات گفتگو ضبط شده و در آخر همینجا منتشر خواهد شد

جهت استفاده از قابلیت Voice Chat از آپدیت بودن تلگرامتون اطمینان حاصل کنین.

سه شنبه ساعت 21:00 منتظرتون هستیم
_______________
@DotNetZoom
1.4K viewsمحمد جواد ابراهیمی, 11:11
باز کردن / نظر دهید
2021-04-23 16:21:05
ویژوال استودیو 2022 به طور کامل از پردازنده های 64 بیتی پشتیبانی میکند و محدودیت حافظه 4 گیگابایتی آن روی devenv.exe برطرف شده است. به این ترتیب امکان باز کردن سولوشن هایی با هزاران پروژه و چند صد هزار فایل ممکن شده است.

این نسخه قرار است از MAUI هم پشتیبانی کند وامکان پیاده سازی اپ های با UI یکسان در انواع پلتفرم ها را فراهم میکند.

پیش بینی میشود نسخه 22 به همراه دات نت 6 در اواخر سال جاری میلادی منتشر شود.
714 viewsمحمد جواد ابراهیمی, 13:21
باز کردن / نظر دهید
2021-04-21 16:31:52
معرفی 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
786 viewsAli Abdolmaleki, 13:31
باز کردن / نظر دهید
2021-04-21 11:00:48
آموزش کار با Lazy در سی شارپ



681 viewsمحمد جواد ابراهیمی, 08:00
باز کردن / نظر دهید
2021-04-19 16:31:12 لاگ کردن جزئیات 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
843 viewsAli Abdolmaleki, 13:31
باز کردن / نظر دهید
2021-04-17 18:39:49 نمونه معماری پیاده سازی شده با ASP.NET Core و Angular و DDD
مناسب جهت 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
1.4K viewsAli Abdolmaleki, 15:39
باز کردن / نظر دهید
2021-04-15 15:45:50 معرفی System.Threading.Channels

فرض
کنید سیستم ایمیل مارکتینگ شما قرار است یک میلیون کاربر را در حافظه لود کند و سپس برای همه‌ی آن‌ها ایمیل ارسال کند. از زمانی که شما این کاربرها را از دیتابیس لود می‌کنید هزینه بالایی بابت کوئری سنگین متحمل می‌شوید و همچنین بعد از لود کردن هم نگهداری این تعداد در حافظه باعث اشغال شدن مقدار زیادی از حافظه می‌شود. (هر چند عملیات با موفقیت انجام می‌شود ولی بهینه نیست!)
از طرفی هم اگر بخواهید مثلا هزار تا هزار تا این داده ها را لود و ارسال کنید، سرعت عملیات پایین می‌آید.

بهینه ترین روش ایجاد سیستمی است که همانند چرخه تولید به مصرف عمل کند. یعنی مصرف کننده داده صرفا داده‌هایی را از یک صف تعریف شده می‌گیرد و قسمت تولید کننده داده هم با استراتژی خاصی داده‌ها را تولید (از دیتابیس لود می‌کند) و داخل صف قرار می‌دهد و هر موقع کارش به اتمام رسید به مصرف کننده اعلام می‌کند تا دیگر منتظر صف نماند.

در اینجا چالش‌های زیادی مطرح می‌شود که در 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

________
1.5K viewsAli Abdolmaleki, 12:45
باز کردن / نظر دهید
2021-04-13 10:39:58 نمایش تعداد کاربران آنلاین در AspNet Core

برای محاسبه تعداد کاربران آنلاین اساسا دو روش وجود داره

روش اول - با استفاده از 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 دقیقه آینده "آنلاین" محسوب میشه

روش دوم - با استفاده از ارتباطات Realtime مانند SignalR

این روش خیلی مشابه روش قبل هست با این تفاوت که به محض برقرار شدن اتصال کاربر (رخداد OnConnectedAsync کلاس Hub) اون رو به عنوان کاربر آنلاین و به محض قطع شدن ارتباطش (رخداد OnDisconnectedAsync کلاس Hub) اون کاربر رو آفلاین در نظر میگیریم.
بقیه موارد ساخت کلید تصادفی و تنظیم کوکی جهت تشخیص کاربر از بقیه کاربر ها تقریبا مشابه قبل هست

مزیت این روش اینه که دیگه ما تلورانس و اختلاف 20 دقیقه رو نخواهیم داشت و به صورت آنی و در لحظه تعداد کاربران آنلاین بروزرسانی خواهد شد
معایبش هم اینه که به دلیل استفاده از ارتباطات realtime پردازش بیشتری نسبت به روش اول روی سرور میوفته و یا اینکه امکان استفاده از ارتباطات realtime در برنامه شما به هر دلیل از جمله زیرساخت network یا محدودیت های سرور و application شما وجود نداشته باشه

نکته آخر اینکه در اینجا سعی کردم مکانیزم خیلی ساده توضیح بدم اما پیاده سازی صحیح چنین مکانیزمی با توجه به امکان وقوع همزمانی مستلزم اینه که نکات پیشگیری از مشکلات همزمانی رعایت بشه

در اینجا یک پروژه نمونه آماده کردم که هر دو این روش ها رو پیاده سازی کرده و میتونین با بررسی سورس کدش بیشتر با نحوه عملکرد اون آشنا بشین
https://github.com/dotnetzoom/OnlineUsers-AspNetCore
_________
@DotNetZoom
2.1K viewsمحمد جواد ابراهیمی, 07:39
باز کردن / نظر دهید
2021-04-10 16:40:25
گنجینه ای ناب از کتاب های مختصر و مفید برنامه نویسی

به معنای واقعی کلمه یه گنجینه ناب هست! سال هاست ازش استفاده میکنم و خیلی راضی ام. بیش از 170 تا کتاب الکترونیکی رایگان داره تو انواع و اقسام موضوعات برنامه نویسی.

کتاباشم خیلی مختصر و مفید هست و اصلا طولانی و خسته کننده نیست، راست کار یه برنامه نویسایی که سرشون شلوغه. یعنی انتظار خیلی deep شدن رو نداشته باشین ولی اگه میخواین تو مدت زمان کمی به یه موضوع تسلط نسبی و یه دید کلی پیدا کنین بهترین گزینه اس.
https://www.syncfusion.com/ebooks/
____________________
@DotNetZoom
1.9K viewsمحمد جواد ابراهیمی, 13:40
باز کردن / نظر دهید