❇️ خواهشا از HttpClient درست استفاده کنیم! (قسمت اول)
کلاس HttpClient محبوب ترین کلاس برای ارتباطات Http است ولی متاسفانه اکثرا از آن بدستی استفاده نمیکنند!
در این پست میخواهیم Best Practice های آن را بررسی کنیم.
در دات نت، 3 کلاس پایه برای ارتباطات Http داریم :
1️⃣ کلاس HttpWebRequest : اولین و low-level ترین کلاس که کنترل بیشتری به شما می دهد
2️⃣ کلاس WebClient : یک محصور کننده hight-level بر روی HttpWebRequest که کنترل کمتری به شما می دهد ولی طرز استفاده آن ساده تر است
3️⃣ کلاس HttpClient : بهینه ترین کلاس موجود برای ارتباطات Http که مزایای هر دو کلاس قبل را داشته و در دات نت 4.5 به بعد (و نیز تمامی ورژن های NETCore) اضافه شد (البته پکیج Nuget آن برای دات نت 4.0 هم وجود دارد)
کلاس HttpClient نسبت به دو کلاس قبلی پرفرمنس بیشتری داشته و متد های اصلی آن (از جمله GetAsync و PostAsync و...) thread-safe است درنتیجه میتوان یک نسخه از آن به صورت Singleton ایجاد و به صورت concurrent استفاده شود.
یک قابلیت مهم دیگر این آن، امکان Chain کردن HttpMessageHandlers ها در HttpClient است (چیزی شبیه به Pipeline میدلور ها در ASP Core) که میتوان از آن برای Logging، Caching و Error handling و ... استفاده کرد (مثال)
4️⃣ کتابخانه RestSharp نیز یک کتابخانه third-party برای ارتباطات Http و مخصوصا REST بوده ولی درون خود از HttpWebRequest استفاده میکند نه HttpClient و پرفرمنس کمتری دارد (نزدیک به نصف!)
5️⃣ کتابخانه Refit هم هست که با قابلیت های مدرن زیادی داره و کار با RESTful API ها رو خیلی راحت میکنه و البته از HttpClient هم استفاده میکنه (در حال حاضر بهترین کتابخانه third-party)
🔰 نکته بسیار مهم، استفاده بهینه و صحیح از این کلاس است که متاسفانه خیلی ها به اشتباه از آن استفاده میکنند
🔸کلاس HttpClient نباید هربار و به ازای هر درخواست، ساخته (new) شود که در این صورت پرفرمنس را به شدت کاهش میدهد!
🔹با وجود اینکه استفاده از یک شی Singleton آن نسبت به ایجاد هر باره آن بهتر است ولی باز هم صحیح نیست و باعث میشود از تغییرات DNS آگاه نشود!
🔸قبلا گفتیم که فقط متد های اصلی آن thread-safe است، پس پروپرتی های آن مانند (DefaultRequestHeaders و BaseAddress و Timeout و ...) thread-safe نیست و نباید بین ترد های مختلف به صورت مشترک استفاده شود
مثلا اگر یک شی Singleton یا static از HttpClient داشته باشید و در میان ترد های مختلف از آن استفاده کنید ممکن است در آن واحد که یک ترد در حال درخواست زدن به یک url است، ترد دیگری BaseAddress آن را تغییر دهد
🔹با وجود اینکه کلاس کلاس HttpClient یک شی Disposable است ولی نباید به صورت دستی Dispose شود درنتیجه استفاده از آن در کنار using (برای Dispose خودکار) به شدت اشتباه است و باعث مشکل حادی را به نام sockets exhaustion (اشباع سوکت های باز) میشود.
🔸نکته قبل، برای خروجی متد های آن، یعنی کلاس HttpResponseMessage صادق نیست و آن هارا باید حتما توسط using یا به صورت دستی Dispose کرد (البته در حالت دستی اگر exception ایی رخ دهد Dispose رخ نخواهد داد پس باید در بلاک try finaly نوشته شود)
🔹نکته بسیار مهم دیگر این است که به هیچ عنوان از کلاس HttpClient به صورت sync استفاده نکنید، ارتباطات network یکی از مهمترین عوامل block کننده thread بوده و دلیل اصلی اینکه کلاس HttpClient فقط و فقط دارای متد های async است همین بوده.
در نتیجه، استفاده از متد های آن به صورت sync همراه با Task.Wait و Task.Result به شدت اشتباه است و باعث بلاک شدن ترد می شود. (این مقوله برای تمامی متد های async صادق است و حتی می تواند باعث dead-lock شود)
در قسمت بعد اصولی ترین و بهینه ترین روش کار با HttpClient را بررسی خواهیم کرد.
#Performance #HttpClient
__________________
@DotNetZoom
کلاس HttpClient محبوب ترین کلاس برای ارتباطات Http است ولی متاسفانه اکثرا از آن بدستی استفاده نمیکنند!
در این پست میخواهیم Best Practice های آن را بررسی کنیم.
در دات نت، 3 کلاس پایه برای ارتباطات Http داریم :
1️⃣ کلاس HttpWebRequest : اولین و low-level ترین کلاس که کنترل بیشتری به شما می دهد
2️⃣ کلاس WebClient : یک محصور کننده hight-level بر روی HttpWebRequest که کنترل کمتری به شما می دهد ولی طرز استفاده آن ساده تر است
3️⃣ کلاس HttpClient : بهینه ترین کلاس موجود برای ارتباطات Http که مزایای هر دو کلاس قبل را داشته و در دات نت 4.5 به بعد (و نیز تمامی ورژن های NETCore) اضافه شد (البته پکیج Nuget آن برای دات نت 4.0 هم وجود دارد)
کلاس HttpClient نسبت به دو کلاس قبلی پرفرمنس بیشتری داشته و متد های اصلی آن (از جمله GetAsync و PostAsync و...) thread-safe است درنتیجه میتوان یک نسخه از آن به صورت Singleton ایجاد و به صورت concurrent استفاده شود.
یک قابلیت مهم دیگر این آن، امکان Chain کردن HttpMessageHandlers ها در HttpClient است (چیزی شبیه به Pipeline میدلور ها در ASP Core) که میتوان از آن برای Logging، Caching و Error handling و ... استفاده کرد (مثال)
4️⃣ کتابخانه RestSharp نیز یک کتابخانه third-party برای ارتباطات Http و مخصوصا REST بوده ولی درون خود از HttpWebRequest استفاده میکند نه HttpClient و پرفرمنس کمتری دارد (نزدیک به نصف!)
5️⃣ کتابخانه Refit هم هست که با قابلیت های مدرن زیادی داره و کار با RESTful API ها رو خیلی راحت میکنه و البته از HttpClient هم استفاده میکنه (در حال حاضر بهترین کتابخانه third-party)
🔰 نکته بسیار مهم، استفاده بهینه و صحیح از این کلاس است که متاسفانه خیلی ها به اشتباه از آن استفاده میکنند
🔸کلاس HttpClient نباید هربار و به ازای هر درخواست، ساخته (new) شود که در این صورت پرفرمنس را به شدت کاهش میدهد!
🔹با وجود اینکه استفاده از یک شی Singleton آن نسبت به ایجاد هر باره آن بهتر است ولی باز هم صحیح نیست و باعث میشود از تغییرات DNS آگاه نشود!
🔸قبلا گفتیم که فقط متد های اصلی آن thread-safe است، پس پروپرتی های آن مانند (DefaultRequestHeaders و BaseAddress و Timeout و ...) thread-safe نیست و نباید بین ترد های مختلف به صورت مشترک استفاده شود
مثلا اگر یک شی Singleton یا static از HttpClient داشته باشید و در میان ترد های مختلف از آن استفاده کنید ممکن است در آن واحد که یک ترد در حال درخواست زدن به یک url است، ترد دیگری BaseAddress آن را تغییر دهد
🔹با وجود اینکه کلاس کلاس HttpClient یک شی Disposable است ولی نباید به صورت دستی Dispose شود درنتیجه استفاده از آن در کنار using (برای Dispose خودکار) به شدت اشتباه است و باعث مشکل حادی را به نام sockets exhaustion (اشباع سوکت های باز) میشود.
🔸نکته قبل، برای خروجی متد های آن، یعنی کلاس HttpResponseMessage صادق نیست و آن هارا باید حتما توسط using یا به صورت دستی Dispose کرد (البته در حالت دستی اگر exception ایی رخ دهد Dispose رخ نخواهد داد پس باید در بلاک try finaly نوشته شود)
🔹نکته بسیار مهم دیگر این است که به هیچ عنوان از کلاس HttpClient به صورت sync استفاده نکنید، ارتباطات network یکی از مهمترین عوامل block کننده thread بوده و دلیل اصلی اینکه کلاس HttpClient فقط و فقط دارای متد های async است همین بوده.
در نتیجه، استفاده از متد های آن به صورت sync همراه با Task.Wait و Task.Result به شدت اشتباه است و باعث بلاک شدن ترد می شود. (این مقوله برای تمامی متد های async صادق است و حتی می تواند باعث dead-lock شود)
در قسمت بعد اصولی ترین و بهینه ترین روش کار با HttpClient را بررسی خواهیم کرد.
#Performance #HttpClient
__________________
@DotNetZoom
www.nuget.org
System.Net.Http 4.0.0
Provides modern classes for sending HTTP requests and receiving HTTP responses from a resource identified by a URI.
Commonly Used Types:
System.Net.Http.HttpResponseMessage
System.Net.Http.DelegatingHandler
System.Net.Http.HttpRequestException
System.Ne…
Commonly Used Types:
System.Net.Http.HttpResponseMessage
System.Net.Http.DelegatingHandler
System.Net.Http.HttpRequestException
System.Ne…
❇️ خواهشا از HttpClient درست استفاده کنیم! (قسمت دوم)
در قسمت قبل روش های کار با Http و مزایا و معایب هرکدام را بررسی کردیم و به نکات و Best Practice های استفاده از HttpClient پرداختیم
در این قسمت میخواهیم بهترین روش استفاده از آن را بررسی کنیم
اصولی ترین و بهینه ترین حالت استفاده از HttpClient، استفاده از کلاس HttpClientFactory موجود در NET Core 2.1. به بعد است
این کلاس وهله سازی HttpClient و Dispose کردن آن را به صورت خودکار و استاندارد به عهده میگیرد و توسط مکانیزم Pooling (استخری از HttpClient ها) وهله های ایجاد شده را مجددا برای درخواست های بعدی استفاده می کند
بدین ترتیب HttpClientFactory از HttpClient های خود، به بهینه ترین نحو استفادهی مجدد میکند و همچنین سربار ایجاد HttpClientهای جدید نیز به حداقل میرسند.
در این روش دیگر مشکل نشتی حافظه یا کمبود منابع ناشی از Dispose نشدن HttpClient ها را نخواهیم داشت زیرا Lifetime وهله ها توسط HttpClientFactory مدیریت می شود
همچنین دیگر مشکل sockets exhaustion (اشباع سوکت های باز) و آگاه نشدن از تغییرات DNS را نخواهیم داشت
برای استفاده از این کلاس 4 روش موجود است
Basic usage
Named clients
Typed clients
Generated clients
روش Basic روش ساده و معمول آن است ولی معمولا در پروژه ها لازم است یک سری کانفیگ خاص را برای هر HttpClient تنظیم کنیم
مثلا HttpClient ایی که قرار است به سایت A درخواست بزند BaseAddress و Timeout و DefaultRequestHeaders (هدرهای پیشفرض) خود را دارد
از انجایی که این پروپرتی ها thread-safe نیستند بهترین راه استفاده از روش های Named clients و Typed clients است
نکته و محدودیت ای که در ورش Typed clients وجود دارد اینست که کلاس استفاده کننده از آن HttpClient الزاما به صورت Transient رجیستر میشود که باید مد نظر داشت و در صورت نیاز از روش Named clients یا ترفند های دیگر استفاده کرد.
روش Generated clients هم مخصوص استفاده از HttpClient توسط کتابخانه های third-party مانند Refit (که در قسمت قبل بررسی کردیم) است
برای یادگرفتن روش صحیح استفاده از HttpClient پیشنهاد میکنم حتما این 3 مقاله را بخوانید
https://www.dotnettips.info/post/2801
https://www.dotnettips.info/post/3022
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2
#Performance #HttpClient
_____________________
@DotNetZoom
در قسمت قبل روش های کار با Http و مزایا و معایب هرکدام را بررسی کردیم و به نکات و Best Practice های استفاده از HttpClient پرداختیم
در این قسمت میخواهیم بهترین روش استفاده از آن را بررسی کنیم
اصولی ترین و بهینه ترین حالت استفاده از HttpClient، استفاده از کلاس HttpClientFactory موجود در NET Core 2.1. به بعد است
این کلاس وهله سازی HttpClient و Dispose کردن آن را به صورت خودکار و استاندارد به عهده میگیرد و توسط مکانیزم Pooling (استخری از HttpClient ها) وهله های ایجاد شده را مجددا برای درخواست های بعدی استفاده می کند
بدین ترتیب HttpClientFactory از HttpClient های خود، به بهینه ترین نحو استفادهی مجدد میکند و همچنین سربار ایجاد HttpClientهای جدید نیز به حداقل میرسند.
در این روش دیگر مشکل نشتی حافظه یا کمبود منابع ناشی از Dispose نشدن HttpClient ها را نخواهیم داشت زیرا Lifetime وهله ها توسط HttpClientFactory مدیریت می شود
همچنین دیگر مشکل sockets exhaustion (اشباع سوکت های باز) و آگاه نشدن از تغییرات DNS را نخواهیم داشت
برای استفاده از این کلاس 4 روش موجود است
Basic usage
Named clients
Typed clients
Generated clients
روش Basic روش ساده و معمول آن است ولی معمولا در پروژه ها لازم است یک سری کانفیگ خاص را برای هر HttpClient تنظیم کنیم
مثلا HttpClient ایی که قرار است به سایت A درخواست بزند BaseAddress و Timeout و DefaultRequestHeaders (هدرهای پیشفرض) خود را دارد
از انجایی که این پروپرتی ها thread-safe نیستند بهترین راه استفاده از روش های Named clients و Typed clients است
نکته و محدودیت ای که در ورش Typed clients وجود دارد اینست که کلاس استفاده کننده از آن HttpClient الزاما به صورت Transient رجیستر میشود که باید مد نظر داشت و در صورت نیاز از روش Named clients یا ترفند های دیگر استفاده کرد.
روش Generated clients هم مخصوص استفاده از HttpClient توسط کتابخانه های third-party مانند Refit (که در قسمت قبل بررسی کردیم) است
برای یادگرفتن روش صحیح استفاده از HttpClient پیشنهاد میکنم حتما این 3 مقاله را بخوانید
https://www.dotnettips.info/post/2801
https://www.dotnettips.info/post/3022
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2
#Performance #HttpClient
_____________________
@DotNetZoom
Docs
Make HTTP requests using IHttpClientFactory in ASP.NET Core
Learn about using the IHttpClientFactory interface to manage logical HttpClient instances in ASP.NET Core.
❇️ عیب یابی و رفع مشکلات پرفرمنسی
در یکی از شرکت هایی که مشاور هستم از من خواسته شده تا مشکلات پرفرمنسی پروژه را پیدا کرده و مناسب ترین راه حل را به آنها پیشنهاد دهم
در هر پروژه ای احتمالا قسمت های زیادی قابل بهبود هستند (چه از لحاظ پرفرمنسی و چه از لحاظ معماری و کدنویسی تمیز و...) اما برای یافتن موثر ترین راه و البته کم هزینه ترین، باید ابتدا Bottleneck (گلوگاه) های سیستم را کشف کرده و سپس بر اساس «هزینه، زمان و منفعت» آنها را الویت بندی کنیم
برای کشف گلوگاه های سیستم (جاهایی که عامل اصلی افت پرفرمنس هستند) باید از ابزار های Profiler استفاده کنیم.
در کل پروفایلر های مختلفی وجود دارند که اکثرا پولی هستند در اینجا میخواهم بهترین آنها رو معرفی کنم
بهترین ابزار های Performance Profiler
1️⃣ برنامه ANTS Performance Profiler (محصول شرکت Redgate)
2️⃣ برنامه dotTrace (محصول شرکت JetBrains)
3️⃣ برنامه PerfView (محصولی "رایگان و سورس باز" از شرکت Microsoft)
4️⃣ برنامه CodeTrack (محصولی "رایگان و سورس باز")
هر چهار برنامه قابلیت های قوی و زیادی دارند از مهمترین شون میشه به موارد زیر اشاره کرد
🔸 قابلیت ثبت سلسله مراتب فراخوانی متد ها
توسط این قابلیت که اصلاحا بهش Call tree میگن میشه فهمید که چه متدی چه متد های دیگه ای رو فراخوانی کرده یا مثلا یک متد کلا چندبار صدا زده شده و هر متد چقدر به طول انجامیده (در قالب یک Timeline کامل) و ....
🔹 قابلیت ثبت تمام کوئری های اجرا شده بر روی دیتابیس
توسط این قابلیت میشه دید چه کوئری هایی و مثلا یک کوئری چندبار روی دیتابیس اجرا شده و هرکدوم چقدر زمان بره و...
🔸 قابلیت ثبت تمام Exception های رخ داده به همراه جزئیات و stacktrace
🔹 قابلیت نمایش تمام Thread های ایجاد شده و فرایند های انجام شده داخلش هر کدومشون و یا کلیه فرایند های انجام شده داخل یک Process
🔸 قابلیت پروفایل کردن همه برنامه ها از جمله
.NET Framework, .NET Core و ASP.NET, ASP.NET Core, Webservices, WCF, Windows Forms, Windows services, WPF ,IIS Website, IIS Express Website, Attach to a running process
❇️ این قابلیت ها برای عیب یابی به شدت مفید هستند چون توی یه سیستم با تراکنش بالا که بعضی مشکلات رو نمیشه پیش بینی کرد با این به راحتی میشه متد ها و یا کوئری های سنگین و اضافه ای که باعث افت پرفرمنس میشه رو پیدا کرد
❇️ هر دو برنامه ANTS و dotTrace پولی بوده و جز بهترین و محبوبترین برنامه های Performance Profiler هستند.
برنامه dotTrace یکپارچگی خوبی با Resharper داره و Visual Studio داره ولی شخصا با توجه به تجربه کاری با جفتشون، برنامه ANTS رو بیشتر می پسندم؛ کارکردن باهاش راحته و UX خوبی داره گزارشات و خروجی کاربردی تری نشون میده
ANTS Performance Profiler overview (ویدئو دمو برنامه)
https://www.youtube.com/watch?v=8mhC-Ji6-uU
❇️ برنامه PerfView هم تقریبا همین قابلیت ها رو داره ولی کارکردن باهاش سخت تره و UX خوبی نداره ولی چون رایگانه محبوبه
برنامه CodeTrack هم قابلیت هاش (نسبت به قبلی ها) کمتره ولی کارکردن باهاش راحته و UX متوسطی داره ونیز رایگانه
❇️ یه قابلیت خوبی که فقط dotTrace داره قابلیت Remote Profiling هست که توسط اون میتونین به برنامه هاتون روی یه سرور Remote دیگه متصل بشین و پرفایلش کنین
#Performance
____________________
@DotNetZoom
در یکی از شرکت هایی که مشاور هستم از من خواسته شده تا مشکلات پرفرمنسی پروژه را پیدا کرده و مناسب ترین راه حل را به آنها پیشنهاد دهم
در هر پروژه ای احتمالا قسمت های زیادی قابل بهبود هستند (چه از لحاظ پرفرمنسی و چه از لحاظ معماری و کدنویسی تمیز و...) اما برای یافتن موثر ترین راه و البته کم هزینه ترین، باید ابتدا Bottleneck (گلوگاه) های سیستم را کشف کرده و سپس بر اساس «هزینه، زمان و منفعت» آنها را الویت بندی کنیم
برای کشف گلوگاه های سیستم (جاهایی که عامل اصلی افت پرفرمنس هستند) باید از ابزار های Profiler استفاده کنیم.
در کل پروفایلر های مختلفی وجود دارند که اکثرا پولی هستند در اینجا میخواهم بهترین آنها رو معرفی کنم
بهترین ابزار های Performance Profiler
1️⃣ برنامه ANTS Performance Profiler (محصول شرکت Redgate)
2️⃣ برنامه dotTrace (محصول شرکت JetBrains)
3️⃣ برنامه PerfView (محصولی "رایگان و سورس باز" از شرکت Microsoft)
4️⃣ برنامه CodeTrack (محصولی "رایگان و سورس باز")
هر چهار برنامه قابلیت های قوی و زیادی دارند از مهمترین شون میشه به موارد زیر اشاره کرد
🔸 قابلیت ثبت سلسله مراتب فراخوانی متد ها
توسط این قابلیت که اصلاحا بهش Call tree میگن میشه فهمید که چه متدی چه متد های دیگه ای رو فراخوانی کرده یا مثلا یک متد کلا چندبار صدا زده شده و هر متد چقدر به طول انجامیده (در قالب یک Timeline کامل) و ....
🔹 قابلیت ثبت تمام کوئری های اجرا شده بر روی دیتابیس
توسط این قابلیت میشه دید چه کوئری هایی و مثلا یک کوئری چندبار روی دیتابیس اجرا شده و هرکدوم چقدر زمان بره و...
🔸 قابلیت ثبت تمام Exception های رخ داده به همراه جزئیات و stacktrace
🔹 قابلیت نمایش تمام Thread های ایجاد شده و فرایند های انجام شده داخلش هر کدومشون و یا کلیه فرایند های انجام شده داخل یک Process
🔸 قابلیت پروفایل کردن همه برنامه ها از جمله
.NET Framework, .NET Core و ASP.NET, ASP.NET Core, Webservices, WCF, Windows Forms, Windows services, WPF ,IIS Website, IIS Express Website, Attach to a running process
❇️ این قابلیت ها برای عیب یابی به شدت مفید هستند چون توی یه سیستم با تراکنش بالا که بعضی مشکلات رو نمیشه پیش بینی کرد با این به راحتی میشه متد ها و یا کوئری های سنگین و اضافه ای که باعث افت پرفرمنس میشه رو پیدا کرد
❇️ هر دو برنامه ANTS و dotTrace پولی بوده و جز بهترین و محبوبترین برنامه های Performance Profiler هستند.
برنامه dotTrace یکپارچگی خوبی با Resharper داره و Visual Studio داره ولی شخصا با توجه به تجربه کاری با جفتشون، برنامه ANTS رو بیشتر می پسندم؛ کارکردن باهاش راحته و UX خوبی داره گزارشات و خروجی کاربردی تری نشون میده
ANTS Performance Profiler overview (ویدئو دمو برنامه)
https://www.youtube.com/watch?v=8mhC-Ji6-uU
❇️ برنامه PerfView هم تقریبا همین قابلیت ها رو داره ولی کارکردن باهاش سخت تره و UX خوبی نداره ولی چون رایگانه محبوبه
برنامه CodeTrack هم قابلیت هاش (نسبت به قبلی ها) کمتره ولی کارکردن باهاش راحته و UX متوسطی داره ونیز رایگانه
❇️ یه قابلیت خوبی که فقط dotTrace داره قابلیت Remote Profiling هست که توسط اون میتونین به برنامه هاتون روی یه سرور Remote دیگه متصل بشین و پرفایلش کنین
#Performance
____________________
@DotNetZoom
YouTube
ANTS Performance Profiler Overview | Redgate
ANTS Performance Profiler is a .NET profiler for desktop, ASP.NET, and ASP.NET MVC applications. Use ANTS Performance Profiler to profile your SQL
queries and see execution plans, find performance bottlenecks fast, get rich performance data, explore unfamiliar…
queries and see execution plans, find performance bottlenecks fast, get rich performance data, explore unfamiliar…
⁉️ خیلی ها سوال میپرسن بهترین شرکت هاستیگ توی ایران چیه
شخصا اطلاعات مستند، دقیق و کاملی ندارم توی این زمینه ولی براساس تجربه و یه سری مطالعات و نظر بعضی از دوستان، اینا نظرات شخصیم هست
🔰اینا بهترین های ایران هستند (ترتیب خاصی وجود نداره، همشون تو یه مایه اند)
▪️https://mihanwebhost.com/ (میهن وب هاست)
🔸میهن وب هاست قیمتاش نسبتا خوبه و واسه شروع گزینه خوبیه ولی سرور هاشون خیلی قوی نیست و بهتره وقتی سایتتون پر بازدید شد برین رو یه هاستینگ دیگه
▪️https://www.iranserver.com/ (ایران سرور)
🔹ایران سرور قیمتاش کمی بالاست ولی سروراش قویه
▪️https://pars.host/ (سرور پارس)
▪️https://parspack.com/ (پارس پک)
▪️https://iranhost.com/ (ایران هاست)
▪️https://hostiran.net/ (هاست ایران)
▪️https://hostdl.com/ (هاست دی ال)
🔸هاست دی ال تقریبا قوی ترین سرور ها رو داره ولی خیلی گرونه
🔰اینا هم معروفن ولی فک نکنم به پای بالایی ها برسن
▪️نتافراز
▪️آبتین وب
▪️وبرمز
▪️برتینا
▪️هاستنگار
▪️سون هاست
▪️میزبان فا
▪️رادکام
🔰خداروشکر تعداد اعضامون به قدری زیاد هست که بتونیم با یه نظر سنجی به دیتای نسبتا معتبری برسیم، پس به زودی یه نظر سنجی هم میذارم ببینیم انتخاب دوستان کدومه
____________________
@DotNetZoom
شخصا اطلاعات مستند، دقیق و کاملی ندارم توی این زمینه ولی براساس تجربه و یه سری مطالعات و نظر بعضی از دوستان، اینا نظرات شخصیم هست
🔰اینا بهترین های ایران هستند (ترتیب خاصی وجود نداره، همشون تو یه مایه اند)
▪️https://mihanwebhost.com/ (میهن وب هاست)
🔸میهن وب هاست قیمتاش نسبتا خوبه و واسه شروع گزینه خوبیه ولی سرور هاشون خیلی قوی نیست و بهتره وقتی سایتتون پر بازدید شد برین رو یه هاستینگ دیگه
▪️https://www.iranserver.com/ (ایران سرور)
🔹ایران سرور قیمتاش کمی بالاست ولی سروراش قویه
▪️https://pars.host/ (سرور پارس)
▪️https://parspack.com/ (پارس پک)
▪️https://iranhost.com/ (ایران هاست)
▪️https://hostiran.net/ (هاست ایران)
▪️https://hostdl.com/ (هاست دی ال)
🔸هاست دی ال تقریبا قوی ترین سرور ها رو داره ولی خیلی گرونه
🔰اینا هم معروفن ولی فک نکنم به پای بالایی ها برسن
▪️نتافراز
▪️آبتین وب
▪️وبرمز
▪️برتینا
▪️هاستنگار
▪️سون هاست
▪️میزبان فا
▪️رادکام
🔰خداروشکر تعداد اعضامون به قدری زیاد هست که بتونیم با یه نظر سنجی به دیتای نسبتا معتبری برسیم، پس به زودی یه نظر سنجی هم میذارم ببینیم انتخاب دوستان کدومه
____________________
@DotNetZoom
میهن وب هاست
خرید هاست ابری ,خرید دامنه,خرید سرور | میهن وب هاست
خرید هاست لینوکس, هاست ایران و خارج, خرید server ، سرور و هاست لینوکس، سرور و هاست ویندوز، هاست وردپرس، انتقال، تمدید و ثبت دامنه را با هاستینگ میهن وب هاست تجربه کنید.
❇️ طبق تجربه اتون کدوم شرکت هاستینگ ایرانی رو پیشنهاد میکنین؟
Anonymous Poll
12%
https://mihanwebhost.com/ (میهن وب هاست)
16%
https://www.iranserver.com/ (ایران سرور)
12%
https://pars.host/ (سرور پارس)
7%
https://parspack.com/ (پارس پک)
7%
https://iranhost.com/ (ایران هاست)
3%
https://hostiran.net/ (هاست ایران)
2%
https://hostdl.com/ (هاست دی ال)
23%
غیره / توی نظرات اعلام میکنم.
28%
شرکت هاستینگ هستم، دیدن نتایج!
DotNetZoom
❇️ طبق تجربه اتون کدوم شرکت هاستینگ ایرانی رو پیشنهاد میکنین؟
🔰 نظرات و مباحثه پیرامون بهترین شرکت های هاستینگ ایرانی 👇
🔸نظر سنجی بالا رو هم واسه دوستاتون ارسال کنین تا هم به آمار بهتری برسیم و هم یه کمکی به جامعه برنامه نویسا واسه رفع دغدغه "از کدوم شرکت هاست بگیرم" کرده باشیم
🔹تعداد ایتم های نظرسنجی محدود هست و نمیشه بیشتر اضافه کرد ولی سعی مواردی که دوستان توی نظرات اعلام میکنن رو اضافه کنم
تا این لحظه (22 خرداد 99) مورادی که دوستان پیشنهاد کردند:
✔️ های ساپورت (3 پیشنهاد)
✔️ صبا هاست (2 پیشنهاد)
✔️ رادکام (2 پیشنهاد)
✔️ مشهد هاست (1 پیشنهاد)
✔️ میزبان سایت (1 پیشنهاد)
✔️ هاستینجا (1 پیشنهاد)
✔️ برتینا (1 پیشنهاد)
______________
@DotNetZoom
🔸نظر سنجی بالا رو هم واسه دوستاتون ارسال کنین تا هم به آمار بهتری برسیم و هم یه کمکی به جامعه برنامه نویسا واسه رفع دغدغه "از کدوم شرکت هاست بگیرم" کرده باشیم
🔹تعداد ایتم های نظرسنجی محدود هست و نمیشه بیشتر اضافه کرد ولی سعی مواردی که دوستان توی نظرات اعلام میکنن رو اضافه کنم
تا این لحظه (22 خرداد 99) مورادی که دوستان پیشنهاد کردند:
✔️ های ساپورت (3 پیشنهاد)
✔️ صبا هاست (2 پیشنهاد)
✔️ رادکام (2 پیشنهاد)
✔️ مشهد هاست (1 پیشنهاد)
✔️ میزبان سایت (1 پیشنهاد)
✔️ هاستینجا (1 پیشنهاد)
✔️ برتینا (1 پیشنهاد)
______________
@DotNetZoom
❇️ پروژه ASP.NET Core آزمون آنلاین مبتنی بر DDD و CQRS و Event Sourcing
🔰تکنولوژی های استفاده شده :
✔️ASP .NET Core
✔️#React
✔️#Microservices
✔️#DDD
✔️#CQRS
✔️#Event_Sourcing
✔️#PostgreSQL
✔️#RabbitMQ
✔️#Docker
✔️#Kubernetes
✔️#TDD
https://github.com/netcorebcn/quiz
__________________
@DotNetZoom
🔰تکنولوژی های استفاده شده :
✔️ASP .NET Core
✔️#React
✔️#Microservices
✔️#DDD
✔️#CQRS
✔️#Event_Sourcing
✔️#PostgreSQL
✔️#RabbitMQ
✔️#Docker
✔️#Kubernetes
✔️#TDD
https://github.com/netcorebcn/quiz
__________________
@DotNetZoom
GitHub
GitHub - netcorebcn/quiz: Example real time quiz application with .NET Core, React, DDD, Event Sourcing, Docker and built-in infrastructure…
Example real time quiz application with .NET Core, React, DDD, Event Sourcing, Docker and built-in infrastructure for CI/CD with k8s, jenkins and helm - GitHub - netcorebcn/quiz: Example real time ...
❇️ پیاده سازی راحت تر درگاه های پرداخت با Parbad
پرباد یه کتابخونه کاربردی و راحت جهت پیاده سازی درگاه های پرداخت هست و از ASP.NET CORE و AS.PNET MVC و ASP.NET WebForms پشتیبانی میکنه
این کتابخونه از انواع درگاه های زیر پشتیبانی میکنه، همچنین یه درگاه پرداخت تستی هم براتون میسازه که در زمان توسعه بتونین راحت تر پرداخت هاتون رو تست کنین.
✔️Mellat
✔️Melli
✔️Saman
✔️Pasargad
✔️Parsian
✔️Iran Kish
✔️Asan Pardakht
✔️ZarinPal
✔️Pay.ir
✔️IDPay.ir
🔰اینم اموزش فارسیش
https://www.dotnettips.info/post/3009
https://www.dotnettips.info/post/3011
https://www.dotnettips.info/post/3012
https://www.dotnettips.info/post/3013
🗂البته داکیومنت خودش بروز تره
https://github.com/Sina-Soltani/Parbad/wiki
https://github.com/Sina-Soltani/Parbad
____________
@DotNetZoom
پرباد یه کتابخونه کاربردی و راحت جهت پیاده سازی درگاه های پرداخت هست و از ASP.NET CORE و AS.PNET MVC و ASP.NET WebForms پشتیبانی میکنه
این کتابخونه از انواع درگاه های زیر پشتیبانی میکنه، همچنین یه درگاه پرداخت تستی هم براتون میسازه که در زمان توسعه بتونین راحت تر پرداخت هاتون رو تست کنین.
✔️Mellat
✔️Melli
✔️Saman
✔️Pasargad
✔️Parsian
✔️Iran Kish
✔️Asan Pardakht
✔️ZarinPal
✔️Pay.ir
✔️IDPay.ir
🔰اینم اموزش فارسیش
https://www.dotnettips.info/post/3009
https://www.dotnettips.info/post/3011
https://www.dotnettips.info/post/3012
https://www.dotnettips.info/post/3013
🗂البته داکیومنت خودش بروز تره
https://github.com/Sina-Soltani/Parbad/wiki
https://github.com/Sina-Soltani/Parbad
____________
@DotNetZoom
💡#آیا_میدانستید
✅ آیا میدانستید حلقه for سریع تر از list.ForEach یا اصلاحا ForEach Lambda است؟
✅ آیا میدانستید حلقه list.ForEach سریع تر از foreach است؟ زیرا list.ForEach داخل خود از for استفاده میکند ولی foreach داخل خود از مکانسیم Enumerator Iteration که به مراتب سنگین تر است، استفاده میکند.
✅ آیا میدانستید حلقه for که مقدار count آن توسط یک متغیر خوانده شود سریع تر از حلقه for ایی است که مقدار count خود را از list.Count میخواند؟ زیرا سرعت خواندن متد get یک property زمانبر تر از خواندن مقدار یک متغیر است.
مثال :
var count = list.Count;
for (int i = 0; i < count ; i++) { }
از روش زیر سریع تر است
for (int i = 0; i < list.Count ; i++) { }
نتیجه :
در تست انجام شده، سرعت اجرای حلقه ها روی 100 میلیون آیتم به ترتیب زیر است
1- حلقه for که از متغیر count میخواند (زمان : 378 میلی ثانیه)
2- حلقه for که از خاصیت list.Count میخواند (زمان : 415 میلی ثانیه)
3- حلقه list.ForEach یا اصطلاحا ForEach Lambda (زمان : 650 میلی ثانیه)
4- حلقه foreach (زمان : 1136 میلی ثانیه)
همانطور که مشاهده میکنید تفاوت این ها آنقدر محسوس نیست که سرعت پروژه را کاهش دهد.
درنتیجه بهتر از کدی را بنویسید که «تمیز» تر است.
_______________
@DotNetZoom
✅ آیا میدانستید حلقه for سریع تر از list.ForEach یا اصلاحا ForEach Lambda است؟
✅ آیا میدانستید حلقه list.ForEach سریع تر از foreach است؟ زیرا list.ForEach داخل خود از for استفاده میکند ولی foreach داخل خود از مکانسیم Enumerator Iteration که به مراتب سنگین تر است، استفاده میکند.
✅ آیا میدانستید حلقه for که مقدار count آن توسط یک متغیر خوانده شود سریع تر از حلقه for ایی است که مقدار count خود را از list.Count میخواند؟ زیرا سرعت خواندن متد get یک property زمانبر تر از خواندن مقدار یک متغیر است.
مثال :
var count = list.Count;
for (int i = 0; i < count ; i++) { }
از روش زیر سریع تر است
for (int i = 0; i < list.Count ; i++) { }
نتیجه :
در تست انجام شده، سرعت اجرای حلقه ها روی 100 میلیون آیتم به ترتیب زیر است
1- حلقه for که از متغیر count میخواند (زمان : 378 میلی ثانیه)
2- حلقه for که از خاصیت list.Count میخواند (زمان : 415 میلی ثانیه)
3- حلقه list.ForEach یا اصطلاحا ForEach Lambda (زمان : 650 میلی ثانیه)
4- حلقه foreach (زمان : 1136 میلی ثانیه)
همانطور که مشاهده میکنید تفاوت این ها آنقدر محسوس نیست که سرعت پروژه را کاهش دهد.
درنتیجه بهتر از کدی را بنویسید که «تمیز» تر است.
_______________
@DotNetZoom
❇️ پیشنهاد نام دامنه وبسایت (Domain Name Generator)
هممون موقع انتخاب کردن نام دامنه یک سایت یا برند همیشه به مشکل میخوریم و نمیدونم چی انتخاب کنیم
شاید یه سری کلمات و ویژگی ها تو ذهنمون هست ولی نمیدونم چطور ترکیبش کنیم که خوب در بیاد، طولانی هم نشه و...
🔹امروز میخوام چندتا ابزار بهتون معرفی کنم که تو این زمینه میتونن کمکمون کنن.
طرز کارش اینطوریه که شما اسم یا اسم هایی که تو ذهنتون هست رو بهشون میدین و اونا بر اساس الگوریتم های مختلف زبانی (مثل مخفف کردن، ترکیب اسم ها و حذف حروف تکراری، افزودن پیشوند ها یا پسوند ها به اسم و...) ، اون کلمات رو با هم ترکیب میکنن و بر اساس ویژگی هاشون به شما پیشنهاد میدن.
همچنین خودشون هم چک میکنن که این دامنه آزاد هست یا خیر.
🔸مثلا وقتی کلمه dotnet رو بدی، پسوند ify و ly رو بهش میچسبونه و نام dotnetify و dotnetly رو بهتون پیشنهاد میده
یا مثلا وقتی کلمه docker رو بدی، پسوند me رو بهش میچسبونه و نام dockerme رو بهتون پیشنهاد میده
خلاصه میتونه کلی ایده بهتون بده که چطوری میتونین یه نام دامنه کوتاه و جذاب پیدا کنین
🔰چهارتا از بهترین هاشون :
https://www.panabee.com/
https://domainwheel.com/
https://www.namemesh.com/
https://namelix.com/
______________
@DotNetZoom
هممون موقع انتخاب کردن نام دامنه یک سایت یا برند همیشه به مشکل میخوریم و نمیدونم چی انتخاب کنیم
شاید یه سری کلمات و ویژگی ها تو ذهنمون هست ولی نمیدونم چطور ترکیبش کنیم که خوب در بیاد، طولانی هم نشه و...
🔹امروز میخوام چندتا ابزار بهتون معرفی کنم که تو این زمینه میتونن کمکمون کنن.
طرز کارش اینطوریه که شما اسم یا اسم هایی که تو ذهنتون هست رو بهشون میدین و اونا بر اساس الگوریتم های مختلف زبانی (مثل مخفف کردن، ترکیب اسم ها و حذف حروف تکراری، افزودن پیشوند ها یا پسوند ها به اسم و...) ، اون کلمات رو با هم ترکیب میکنن و بر اساس ویژگی هاشون به شما پیشنهاد میدن.
همچنین خودشون هم چک میکنن که این دامنه آزاد هست یا خیر.
🔸مثلا وقتی کلمه dotnet رو بدی، پسوند ify و ly رو بهش میچسبونه و نام dotnetify و dotnetly رو بهتون پیشنهاد میده
یا مثلا وقتی کلمه docker رو بدی، پسوند me رو بهش میچسبونه و نام dockerme رو بهتون پیشنهاد میده
خلاصه میتونه کلی ایده بهتون بده که چطوری میتونین یه نام دامنه کوتاه و جذاب پیدا کنین
🔰چهارتا از بهترین هاشون :
https://www.panabee.com/
https://domainwheel.com/
https://www.namemesh.com/
https://namelix.com/
______________
@DotNetZoom
Panabee
Stock News, Financial Analysis, and Investor Questions
Panabee helps investors surface impactful news, decode misunderstood opportunities, and explore crucial questions.
❇️ نکاتی در مورد تست نویسی روی EF6 / EFCore توسط دیتابیس InMemory
🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه
🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.
🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده
🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)
نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.
این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظهی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا میشود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده
🔹در نتیجه همه اینها پاس شدن یک تست با دیتابیس InMemory الزاما دلیل بر صحت عملکرد پروژه و به معنای درست کار کردن برنامه در دنیای واقعی نیست. و ممکنه همون تست با دیتابیس واقعی به خطا بخوره.
🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم
🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه
🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.
🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده
🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)
نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.
این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظهی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا میشود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده
🔹در نتیجه همه اینها پاس شدن یک تست با دیتابیس InMemory الزاما دلیل بر صحت عملکرد پروژه و به معنای درست کار کردن برنامه در دنیای واقعی نیست. و ممکنه همون تست با دیتابیس واقعی به خطا بخوره.
🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم
🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
Docs
Testing with a mocking framework - EF6
Testing with a mocking framework in Entity Framework 6
«مهم ترین» عاملی که برای شما باعث ایجاد انگیزه و رضایت شغلی میشه چیه؟
Anonymous Poll
30%
ارتقاء سطح علمی
32%
حقوق بیشتر
4%
حقوق به موقع
10%
محیط دوستانه و پویا
4%
امکان کار از راه دور (Remote)
4%
تایم کاری انعطاف پذیر
16%
دیدن نتایج
🔰 #آیا_میدانستید
که نوع Dictionary در سی شارپ، آیتم ها رو به همون ترتیبی که اضافه میکنین، نگه نمیداره⁉️
https://dotnetfiddle.net/cv49I2
___________________
@DotNetZoom
که نوع Dictionary در سی شارپ، آیتم ها رو به همون ترتیبی که اضافه میکنین، نگه نمیداره⁉️
https://dotnetfiddle.net/cv49I2
___________________
@DotNetZoom
dotnetfiddle.net
C# Online Compiler | .NET Fiddle
Test your C# code online with .NET Fiddle code editor.
This media is not supported in your browser
VIEW IN TELEGRAM
🔰 معرفی FilePond : یک پلاگین اپلود زیبا
به همراه کتابخانه یکپارچه شده برای jQuery و Angular و React و Vue
[Demo] https://pqina.nl/filepond
https://github.com/pqina/filepond
____________________
@DotNetZoom
به همراه کتابخانه یکپارچه شده برای jQuery و Angular و React و Vue
[Demo] https://pqina.nl/filepond
https://github.com/pqina/filepond
____________________
@DotNetZoom
❇️ استفاده از MongoDb در سیستم احراز هویت ASP.NET Core Identity
اگه توی پروژه ASPNET Core ایی تون از MongoDb استفاده میکنین و میخواین از سیستم احراز هویت Identity روش پیاده کنین
این کتابخونه (AspNetCore.Identity.MongoDbCore) کار یکپارچه سازیش رو براتون انجام میده
کتابخانه های زیادی برای پشتیبانی از MongoDb در Identity وجود دارند که من همشون رو بررسی کردم و این بهترینشون و کاملترینشون بود (بعدشم این یکی AspNetCore.Identity.Mongo)
🔰لینک ریپازیتوری گیتهاب (اموزششم توش هست)
https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore
#MongoDb #Identity
__________________
@DotNetZoom
اگه توی پروژه ASPNET Core ایی تون از MongoDb استفاده میکنین و میخواین از سیستم احراز هویت Identity روش پیاده کنین
این کتابخونه (AspNetCore.Identity.MongoDbCore) کار یکپارچه سازیش رو براتون انجام میده
کتابخانه های زیادی برای پشتیبانی از MongoDb در Identity وجود دارند که من همشون رو بررسی کردم و این بهترینشون و کاملترینشون بود (بعدشم این یکی AspNetCore.Identity.Mongo)
🔰لینک ریپازیتوری گیتهاب (اموزششم توش هست)
https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore
#MongoDb #Identity
__________________
@DotNetZoom
www.nuget.org
AspNetCore.Identity.MongoDbCore 6.0.0
A MongoDb UserStore and RoleStore adapter for Microsoft.Extensions.Identity.Core 6.0.
#سری_معرفی_وسایت_های_برتر
✅ معرفی 10 سایت های برتر (سری سوم)
در مورد #C و NET Core. و ASP.NET Core
🔶 اگه مشتاق به یادگیری و مطالعه هستین این میتونه بهترین پست برای شما باشه. توی این سری پست ها هربار 10 وبسایت که از نظر سطح علمی و کیفیت محتوا، بروز و متنوع بودن بهترین هستند رو معرفی میکنم👌
اینا در واقع منابعی هستند که خودم معمولا دنبالشون میکنم
🔷 یادتون نره واسه رفقاتون بفرستید✌️
1️⃣ https://fullstackmark.com/
2️⃣ https://www.syncfusion.com/blogs/
3️⃣ https://weblog.west-wind.com/
4️⃣ https://www.blog.jamesmichaelhickey.com/
5️⃣ https://logcorner.com/
6️⃣ https://cmatskas.com/
7️⃣ http://www.tugberkugurlu.com/
8️⃣ https://dotnetcoretutorials.com/
9️⃣ https://damienbod.com/
🔟 https://chrissainty.com/
_________________
@DotNetZoom
✅ معرفی 10 سایت های برتر (سری سوم)
در مورد #C و NET Core. و ASP.NET Core
🔶 اگه مشتاق به یادگیری و مطالعه هستین این میتونه بهترین پست برای شما باشه. توی این سری پست ها هربار 10 وبسایت که از نظر سطح علمی و کیفیت محتوا، بروز و متنوع بودن بهترین هستند رو معرفی میکنم👌
اینا در واقع منابعی هستند که خودم معمولا دنبالشون میکنم
🔷 یادتون نره واسه رفقاتون بفرستید✌️
1️⃣ https://fullstackmark.com/
2️⃣ https://www.syncfusion.com/blogs/
3️⃣ https://weblog.west-wind.com/
4️⃣ https://www.blog.jamesmichaelhickey.com/
5️⃣ https://logcorner.com/
6️⃣ https://cmatskas.com/
7️⃣ http://www.tugberkugurlu.com/
8️⃣ https://dotnetcoretutorials.com/
9️⃣ https://damienbod.com/
🔟 https://chrissainty.com/
_________________
@DotNetZoom
Fullstackmark
FullStack Mark - curiosity-driven development
Fullstack software development applying best practices and craftmanship.
Forwarded from کدهک
آموزش آپلود کردن فایل در ASP NET Core
در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.
https://codehaks.com/go/eoz
در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.
https://codehaks.com/go/eoz
✅ کتابخانه اعتبارسنجی FoolProof برای ASP.NET Core
خیلی وقتا لازم میشه یه سری اعتبارسنجی روی مقادیر ورودی کاربر داشته باشیم. مثلا مقدارش کمتر یا بیشتر از فلان مقدار نباشه و ... تو این شرایط معمولا خودمون میایم و یه Attribute Validation سفارشی ایجاد میکنیم (که تازه اعتبار سنجی سمت کلاینت با jQuery رو هم نداره و فقط سمت سرور چک میشه) ولی الان میخوام یه کتابخونه رو معرفی کنیم که کارتون رو خیلی راحت میکنه.
🔸کتابخانه FoolProof.Core تعداد زیادی Attribute برای اعتبار سنجی مقادیر کاربر داره که همگی علاوه بر Server-side از Client-side Validation هم پشتیبانی میکنن. نسخه قدیمی آن (foolproof) برای ASPNET MVC سابق است.
(آموزش استفاده از آن در سایت dotnettips) ولی این نسخه از ASPNET Core پیشتیبانی میکنه
🔹لیست Attribute های پشتیبانی شده:
✔️ Is
✔️ EqualTo
✔️ NotEqualTo
✔️ GreaterThan
✔️ LessThan
✔️ GreaterThanOrEqualTo
✔️ LessThanOrEqualTo
✔️ Improved required validators:
✔️ RequiredIf
✔️ RequiredIfNot
✔️ RequiredIfTrue
✔️ RequiredIfFalse
✔️ RequiredIfEmpty
✔️ RequiredIfNotEmpty
✔️ RequiredIfRegExMatch
✔️ RequiredIfNotRegExMatch
✔️ In
✔️ NotIn
🔰لینک پکیچ Nuget و مخزن گیتهاب
https://www.nuget.org/packages/FoolProof.Core/
https://github.com/rpgkaiser/FoolProof.Core
#FoolProof #Validation #اعتبارسنجی
__________________
@DotNetZoom
خیلی وقتا لازم میشه یه سری اعتبارسنجی روی مقادیر ورودی کاربر داشته باشیم. مثلا مقدارش کمتر یا بیشتر از فلان مقدار نباشه و ... تو این شرایط معمولا خودمون میایم و یه Attribute Validation سفارشی ایجاد میکنیم (که تازه اعتبار سنجی سمت کلاینت با jQuery رو هم نداره و فقط سمت سرور چک میشه) ولی الان میخوام یه کتابخونه رو معرفی کنیم که کارتون رو خیلی راحت میکنه.
🔸کتابخانه FoolProof.Core تعداد زیادی Attribute برای اعتبار سنجی مقادیر کاربر داره که همگی علاوه بر Server-side از Client-side Validation هم پشتیبانی میکنن. نسخه قدیمی آن (foolproof) برای ASPNET MVC سابق است.
(آموزش استفاده از آن در سایت dotnettips) ولی این نسخه از ASPNET Core پیشتیبانی میکنه
🔹لیست Attribute های پشتیبانی شده:
✔️ Is
✔️ EqualTo
✔️ NotEqualTo
✔️ GreaterThan
✔️ LessThan
✔️ GreaterThanOrEqualTo
✔️ LessThanOrEqualTo
✔️ Improved required validators:
✔️ RequiredIf
✔️ RequiredIfNot
✔️ RequiredIfTrue
✔️ RequiredIfFalse
✔️ RequiredIfEmpty
✔️ RequiredIfNotEmpty
✔️ RequiredIfRegExMatch
✔️ RequiredIfNotRegExMatch
✔️ In
✔️ NotIn
🔰لینک پکیچ Nuget و مخزن گیتهاب
https://www.nuget.org/packages/FoolProof.Core/
https://github.com/rpgkaiser/FoolProof.Core
#FoolProof #Validation #اعتبارسنجی
__________________
@DotNetZoom
www.nuget.org
FoolProof.Core 1.2.1
Migration to asp.net core of the "MVC Foolproof Validation" library.
❇️ نمونه معماری پیاده سازی شده با ASP.NET Core و Angular و DDD
Architecture with .NET Core 3.1, ASP.NET Core 3.1, Entity Framework Core 3.1, C#, Angular 9.1, Clean Code, SOLID, DDD, Code Analysis, Docker and more.
🔸Technologies
✔️ .NET Core 3.1
✔️ ASP.NET Core 3.1
✔️ Entity Framework Core 3.1
✔️ C# 8.0
✔️ Angular 9.1
✔️ Typenoscript
✔️ JWT
✔️ FluentValidation
✔️ Scrutor
✔️ Serilog
✔️ Docker
✔️ Azure DevOps
✔️ ...
🔹Practices
✔️ Clean Code
✔️ SOLID Principles
✔️ DDD (Domain-Driven Design)
✔️ Unit of Work Pattern
✔️ Repository Pattern
✔️ ...
https://github.com/rafaelfgx/Architecture
________________
@DotNetZoom
Architecture with .NET Core 3.1, ASP.NET Core 3.1, Entity Framework Core 3.1, C#, Angular 9.1, Clean Code, SOLID, DDD, Code Analysis, Docker and more.
🔸Technologies
✔️ .NET Core 3.1
✔️ ASP.NET Core 3.1
✔️ Entity Framework Core 3.1
✔️ C# 8.0
✔️ Angular 9.1
✔️ Typenoscript
✔️ JWT
✔️ FluentValidation
✔️ Scrutor
✔️ Serilog
✔️ Docker
✔️ Azure DevOps
✔️ ...
🔹Practices
✔️ Clean Code
✔️ SOLID Principles
✔️ DDD (Domain-Driven Design)
✔️ Unit of Work Pattern
✔️ Repository Pattern
✔️ ...
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...
✅ معرفی Design Pattern ها به همراه مثال در زبان های مختلف
یکی از بهترین سایت هایی که میشه به عنوان مرجع برای #DesignPattern ها بهش نگاه کرد سایت زیر هست.
این سایت خیلی روون و ساده الگو های برنامه نویسی رو توضیح داده، براشون مثال زده و توی زبان های مختلفی از جمله #C و JavaScript و Java و Python و ... پیاده سازیشون کرده
1️⃣ https://refactoring.guru/design-patterns/catalog
2️⃣ https://www.dofactory.com/net/design-patterns
🔰2تا ریپوی زیر هم پیاده سازی ایی از این دیزاین پترن ها در سی شارپ هست
1️⃣ https://github.com/exceptionnotfound/DesignPatterns
2️⃣ https://github.com/HamidMosalla/CSharpDesignPatterns
_____________________
@DotNetZoom
یکی از بهترین سایت هایی که میشه به عنوان مرجع برای #DesignPattern ها بهش نگاه کرد سایت زیر هست.
این سایت خیلی روون و ساده الگو های برنامه نویسی رو توضیح داده، براشون مثال زده و توی زبان های مختلفی از جمله #C و JavaScript و Java و Python و ... پیاده سازیشون کرده
1️⃣ https://refactoring.guru/design-patterns/catalog
2️⃣ https://www.dofactory.com/net/design-patterns
🔰2تا ریپوی زیر هم پیاده سازی ایی از این دیزاین پترن ها در سی شارپ هست
1️⃣ https://github.com/exceptionnotfound/DesignPatterns
2️⃣ https://github.com/HamidMosalla/CSharpDesignPatterns
_____________________
@DotNetZoom
Forwarded from کدهک
آشنایی با Docker
داکر ابزاری برای توزیع و اجرای نرم افزار است که مشکل سازگاری با سیستم عامل های مختلف را حل میکند. این ابزار امروزه همه جا مورد استفاده قرار میگیرد و خوب است به عنوان توسعه دهنده ی نرم افزار درباره آن بیشتر بدانید. در این ویدیو به معرفی داکر می پردازیم و در ادامه از Docker در یک پروژه ASP NET Core استفاده می کنیم.
https://cutt.ly/ortrfXx
داکر ابزاری برای توزیع و اجرای نرم افزار است که مشکل سازگاری با سیستم عامل های مختلف را حل میکند. این ابزار امروزه همه جا مورد استفاده قرار میگیرد و خوب است به عنوان توسعه دهنده ی نرم افزار درباره آن بیشتر بدانید. در این ویدیو به معرفی داکر می پردازیم و در ادامه از Docker در یک پروژه ASP NET Core استفاده می کنیم.
https://cutt.ly/ortrfXx