C# Programming Guide
193 subscribers
113 photos
9 videos
14 files
102 links
سلام دوستان در این کانال نکاتی در مورد مسائل پیشرفته در سی شارپ ارائه میشه که مربوط به بیش از 15 سال تجربه ی کاری من هست.
ممنون از اینکه دنبال میکنید.
اگر نکات خاصی به ذهنتون رسید با ادمین در میون بذارید
تماس با ادمین:
@Ali_Visual_Studio
Download Telegram
اون دسته از عزیزانی که مثل من vs 2017 رو به صورت offline installer دانلود و نصب کردند و حدود 100 گیگ شده و میخوان به ویژوال استادیو 2019 بروز رسانی کنند لازم نیست همه ی پکیج ها رو از اول دانلود و نصب کنند.
فقط کافیه به همون روش قبلی عمل کنند و از سایت زیر فایل نصبی رو جایگزین کرده و سپس ستاپ ویژوال استادیو 2017 رو به 2019 تبدیل و نصب کنند.سپس فایل installer خودش نیازمندی های جدید رو دانلود میکنه و قبلی هایی که روی 2017 داشتید مجدد دانلود نمیشن.

https://developerinsider.co/download-visual-studio-2019-web-installer-iso-community-professional-enterprise
انتظار میرود در نسخه ی بعدی یعنی نسخه ی 6 سیگنالگو چه قابلیت هایی داشته باشیم؟
1.ساپورت پترن Dependency Injection
2.ریفکتور کردن پروژه و بالا بردن پرفورمنس سیگنالگو به بهترین حالت ممکن (در حال انجام)
3.ساپورت پروتکل UDP
4.بهبود و بالابردن استفاده های راحت تر از مباحث OperationContext و مدیریت راحت تر کلاینت ها به صورت Real-Time
5.سیستم لاگ

اهداف آینده؟
1.ساخت متد هایی که تا الان در سرویس های سیگنالگو نوشتید به صورت یک Test Case بدون زدن کد. این روش باعث میشه که شما متد هاتون رو تست کنید بدون اینکه برای پروژتون test case بنویسید!!
2.پیاده سازی Data Exchanger به صورت Queryable و حرفه ای که برنامه نویسی و ارتباط و کوئری های بین کلاینت و سرور رو داینامیک و نا محدود میکنه. تا الان هم بخشی زیادی از این سیستم پیاده سازی شده.

دوستان عزیز هر گونه کامنت یا سوال رو میتونید همینجا بزنید یا به خودم ارسال کنید @ali_visual_studio
پکیج JsonGo یکی از پکیج های ساده ای هست که زدم و همونطور که در تصویر مشاهده میکنید حداقل دو برابر سریعتر از پکیج newtonsoft.json هست با قابلیت loop handling از این پکیج سریع قرار هست در سریالایز و دیسریالایز signalgo استفاده بشه.همونطور که میدونید یکی از مسائلی که ما قراره در signalgo 6 داشته باشیم سرعت بسیار بالای اون هست.
https://github.com/Ali-YousefiTelori/JsonGo
دوستان عزیز سایت https://signalgo.net:8080 جهت تست سرور های سیگنالگو توسط یکی از بچه های تیم سیگنالگو در حال تکمیل شدن هست. از این پس میتونید سرور های سیگنالگو خودتون رو با استفاده از این وبسایت تست کنید.این سایت در مرحله تست می باشد و ان شالله موارد بسیاری به آن اضافه خواهد شد.
#امنیتی

در پی حملاتی که به سرور میشد از طرف سرویس دهنده گزارشی مبنی بر حمله دریافت کردم.راستش این حملات رو توی همه ی سرور هایی که تا الان داشتم دارم.طرف با ای پی های مختلف درخواست وصل شدن به سرور ریموت میده، جالب اینجاست که اگر پسوردتون هک بشه این پسورد روی دیتابیس هکر ذخیره میشه و به بقیه ی سرور های تحت حمله اون پسورد رو میفرسته یعنی اگر پسوردتون هک شد دیگه از اون پسورد استفاده نکنید.ولی منم ساکت ننشستم و یک نرم افزار ساده توی ده دیقه زدم که همه ی آی پی هایی که درخواست ورود ناموفق به ریموت داشتن رو بلاک میکنه.در نتیجه تعداد درخواست ها هر روز داره کمتر میشه و تا اینکه به صفر رسیده.
در اصل تمامی آی پی های هکر توی فایروال به طور اتوماتیک بلاک میشه و دیگه نمیتونه با ای پی های مختلف درخواست وصل شدن به سرور بده
سورس:
https://github.com/Ali-YousefiTelori/Firewall-Ip-Blocker

@CSharpTips
نسخه ی آزمایشی Preview1 پکیج JsonGo امروز روی Nuget منتشر شده و دوستان میتونن از نظر پرفورمنس و کارایی با این پکیج کار کنند.
آدرس nuget:
https://www.nuget.org/packages/JsonGo/
سورس:
https://github.com/Ali-YousefiTelori/JsonGo
به زامارین قابلیت جدید Hot reload اضافه شده. تغییرات جدید بدون نیاز به کامپیابل و اجرای مجدد در زمان اجرا در نرم افزار اعمال میشن... یعنی شما نرم افزار رو روی گوشیتون اجرا میکنید، کد رو تغییر میدید و نرم افزار تغییر میکنه.

https://www.youtube.com/watch?time_continue=4&v=Y3nGkzbc0JE
اگر برنامه نویسید، در عین حال بازی کامپیوتری هم دوست دارید حتما بازی دوتا 2 رو امتحان کنید
توی یک شرکتی کار میکنم که علاقه زیادی به استفاده از سیگنالگو نشون ندادن، شاید به خاطر عدم اعتمادشون به خودم که برنامه سیگنالگو هستم بود، میخوام چند تا از مشکلاتی که با تکنولوژی های روز کار میکنید رو خوردیم امروز براتون بگم.

پروژه روی Abp در حال توسعه بود،کلاینت Angular و پروژه ی بسیار بزرگی استارت خورده که شامل دو تا پروژه ی B2B و یک B2C وقتی وارد شرکت شدم بچه ها همچنان در حال توسعه ی کار ها بودن اول اینکه Abp خروجی توابع شمارو به یک کلاس داخلی خودش Wrap میکنه که شامل success و result و Error و... هست.تا اینجا اوکی هست ولی وقتی بخواید کاستومایزش کنید چه اتفاقی میوفته؟ خب ما نمیخواستم خروجی apb رو بذاریم کنار بلکه میخواستیم دو تا فیلد بهش اضافه کنیم در نتیجه یک کلاس ساختیم و از خروجی abp ارث بردیم و توابع سرویس ها رو DontWrap کردیم. خوب سرور که اوکی بود Swagger هم اوکی بود... مشکل کد جنریتور سواگر بود که برای کلاینت خروجی ها رو درست تولید نمی کرد در نتیجه ریزالت ها کاملا اشتباه و همش نال سمت کلاینت ساخته میشد.پروژه اول روی abp و سیگنالگو با هم در حال اجرا بود اما مدیر پروژه اصرار داشت روی Abp باشه ما هم برداشتیمش و به این مشکل خوردیم فلذا من مجدد پیشنهاد کردم که از کد جنرتور سیگنالگو استفاده کنیم و کردیم و مشکل حل شد.عدم ایجاد محدودیت توی سیگنالگو هم باعث شد سرویس های abp رو فقط با یک اتریبیوت تبدیل به سیگنالگو کنیم دوم اینکه با اینکه از سرویس های سیگنالگو به درخواست مدیر پروزه استفاده نکردیم ولی باز هم به خاطر رفع باگ های سیستم داخلی تونستیم با سیگنالگو مشکل رو حل و به جلو ببریم.
مساله ی بعدی Dependency Injection بود که به خودی خود به خاطر کانستراکتور و ورودی های زیادی که داشت اتوماتیک پروژه رو کثیف میکرد پس اینجا هم مجبور شدیم یک کدی بزنیم که اینهمه کانستراکتور رو با ورودی های زیادی تولید نکنیم، مساله ی بعدی اینکه باز هم سیگنالگو به دلیل عدم محدودیت میتونست از اخرین نسخه و حتی preview های ef core استفاده کنه ولی abp اخرین نسخه ریلیز شدش به دلیل وابستگی های زیادی که توی پروژه داشت نمیتونست از اخرین نسخه ی ef core استفاده کنه.
ساختار abp به دلیل استفاده از Dependency Injection میگه وابستگی ها رو به دلیل معماری از پروژه ی شما بر میداره ولی ایا میدونید وقتی از abp استفاده میکنید 90 درصد پروژتون به خود abp داره وابسته میشه؟ پس این ادعا فقط برای کامپوننت های دیگست نه خود abp در حالی توی سیگنالگو کلاس سی شارپتون بدون هیچ ارث بری ای تبدیل به سرویس میشه!!
حالا به سری مشکلات عجیب و غریب دیگه هم خوردیم مثلا یک تابع داریم توی سرور که ورودی فقط یک عدد میگیره در حالی که تابع Post هست و باید از طریق Body مقدار فرستاده بشه به سرور ولی سرور اصرار داره اون مقدار از طریق آدرس Url یعنی مثل Get فرستاده بشه و Body خالی باشه و FromBody هم مشکل رو حل نکرد.خب توی سیگنالگو چطوریاس؟
سیگنالگو عملا اهمیتی به این نمیده که تابع شما روی post هست یا Get یعنی همچین قابلیتی نداره و برنامه نویس درگیر get و post و multi part و .... نمیشه ولی یک تابع رو میتونید به همه ی این صورت ها صدا بزنید یعنی هم get صداش کنید هم post صداش کنید و هم multi part و ... خب من وقتی سالها با سیگنالگو سرور هامو خیلی سریع و ساده می نوشتم انتظار داشتم این طرف هم اینقدر ساده باشه.ولی متاسفانه هر روز یک مشکل و محدودیت جدید. واقعا هنوز نمیدونم چرا برنامه نویس های بک اند یا فرانت اند میترسن که از این تکنولوژی استفاده کنن شاید به این دلیله که یک ایرانی نوشته؟هنوز خودشون رو وابسته به پروژه های مایکروسافت و معماری های اونا میدونن خب یکبار هم شده سیگنالگو رو امتحان کنید شاید واقعا از چارچوب محدودیت که بیرون اومدید متوجه میشید اونطرف چقدر کارتون سخت بوده و اینور چقدر راحت شده.منم هدفم همین بوده دیگه مشکلات رو دیدم و سعی در حلشون کردم.
#Abp
#SignalGo
@CsharpTips
نمایی دور از کاری که Dependency Injection میتونه با کلاس شما انجام بده
C# Programming Guide
نمایی دور از کاری که Dependency Injection میتونه با کلاس شما انجام بده
چیزی که در تصویر بالا می بینید قسمتی از کلاسی هست که با استفاده از Dependency Injection ورودی ها رو از طریق کانستراکتور میگیره، هموطنور که میبینید اصلا توی صفحه جا نشد!!! به ازای هر Injection هم باید کانستراکتور رو شلوغ کنید و هم به یک فیلد readonly اونو مقدار دهی کنید.در حالی که با چند خط کد ساده میشه همشون رو Resolve کرد بدون اینکه کانستراکتور اینطوری ایجاد کنید و اینهمه یک کلاس رو شلوغ کنید که واقعا این شلوغی کار رو خیلی زشت میکنه (یکی از دلایلی که مخالف DI هستم). اما اینکار رو باید asp یا abp انجام میدادن نه شما، ما در سیگنالگو 6 به طور کامل کانستراکتور رو از Dependency injection حذف میکنیم.
اتریبیوت های اعتبار سنجی در سیگنالگو
C# Programming Guide
اتریبیوت های اعتبار سنجی در سیگنالگو
این اتریبیوت ها رو میتونید به صورت Fluent Api هم تعریف کنید. توی سیگنالگو منطقی به نام اتریبیوت های پیشفرض وجود نداره شما اتریبیوت ها و منطق اعتبار سنجی خودتون رو پیاده سازی میکنید مثل پیاده سازی اعتبار سنجی Email بعدش روی ورودی های توابع یا پروپرتی های کلاس ها استفاده میکنید.وقتی دارید یک سرویس Api ارائه میکنید این attribute ها خیلی به کمک استفاده کننده از Api شما میان و خودشون به تنهایی یک داکیومنت کامل برای مصرف کننده میشن. قسمت جالبش اینجاست که اعتبار سنجی برای تک تک بخش ها انجام میشه و تمامی خطا های ولیدیشن میتونه به سمت کلاینت بره و اینطور نیست که به استفاده کننده بگه لطفا نام رو وارد کنه، اگر فامیلی رو هم وارد نکرده باشه هر دو رو بهش برمیگردونه اینطوری یوزر مجبور نیست هر بار سرویس رو صدا بزنه تا به خطای اعتبار سنجی جدید مواجه بشه.
اینکار از نظر پرفورمنس اهمیتی نداره چون یوزر قرار نیست در استفاده از سرویس شما همیشه به خطای اعتبار سنجی بخوره بلکه یکبار اونم بار اول که داره استفاده میکنه به این خطا ها میخوره و رفعش میکنه، خوبیش اینه که هم همه چیز رو در یک جا خوب میبینه و هم خیلی راحت حلشون میکنه. منطق اعتبار سنجی هاتون رو یکبار مینویسید و توی تمام پروزه ها و مدل هاتون استفاده میکنید.
یک اشتباه رایج در مورد Task.Run وجود داره اینکه که خیلی ها فکر میکنن این متد یک Thread جدید ایجاد میکنه در حالی که اینطور نیست مکانزیم تسک ها به هیچ عنوان ترد جدید ایجاد نمی کنه بلکه ایجاد ترد ها رو مدیریت میکنه وگرنه ساختن ترد جدید به صورت دستی کافی بود نیازی به مکانیزم پیچیده ای مثل مدیریت تسک ها نبود. شما اگر ده هزار تا تسک ایجاد کنید ممکنه فقط با سی تا ترد هندل بشه، تسک ها وظایفی هستند که ترد ها اونها رو اجرا و انجام میدن بنابراین ایجاد تسک ایجاد یک ترد جدید نیست بلکه فقط ایجاد یک وظیفه ی جدید برای یک ترد هست ممکنه صد ها تسک شما فقط به وسیله ی یک ترد هندل بشه... برای همین به هیچ عنوان توی توابع خودتون تسک هاتون رو لاک یا busy نکنید مثلا از کلید واژه ی lock استفاده نکنید یا Thread.Sleep یا عملیاتی که باعث قفل شدن یک ترد برای چند ثانیه یا دقیقه میشن مثل استفاده از توابع sync به جای async شما میتونید به جای lock از SemaphoreSlim و به جای Thread.Sleep از Task.Delay استفاده کنید همه ی توابع کار با فایل و استریم و دانلود و ... بهشون توابع async اضافه شده که باید از اونا استفاده بشه بنابراین از توابع sync استفاده نکنید تا تسک ها رو بلاک کنید اینطوری سیستم برای هر تسک مجبوره یک ترد ایجاد کنه، سیستم مدیریت تسک ها وقتی ترد ها رو مشغول ببینه سعی میکنه ترد جدید ایجاد کنه و اینجا فاجعه رخ میده.
وقتی با سیگنالگو میتونید یک پروژه رو سریعتر پیاده سازی کنید دیگه ساعتی کار کردن براتون نمیصرفه، مثلا یکی از دوستام بهم گفت یک پروژه هست فقط بک اند ساعتی 60 انجام میدی؟ گفتم خب ارزش نداره برای انجامش300 گیرم بیاد خنده داره این قیمت، گفت راست میگی، گفت ساعتی 500 چطور؟ گفتم بازی نمیصرفه!! درسته این پروژه برای من سادست ولی 4 میلیون می ارزه که انجامش بدم ولی اگر ساعتی انجام بدم برام نمیصرفه.
این یعنی چی؟ یعنی یک پروژه بک اند توسط شما توی کمتر از 6 ساعت انجام میشه در حالی که ساعتی 500 هزارتومان مبلغ بالایی هست برای کسی که دارید انجام میدید بنابراین بهتره که توی این مواقع هزینه ها رو پروژه ای حساب کنید، کسانی که پروژه ها رو سریع انجام میدن ساعتی براشون نمیصرفه چون یا کارفرما فکر میکنه کار خیلی سادست یا شما خیلی هزینه رو بالا میگید.
مدیریت میکروسرویس ها با سیگنالگو توسط اپلیکیشنی به بنام SignalGo Server Manager انجام میشه این اپلیکیشن تمامی کنسول های میکرو سرویس های شما رو توی یک پروسه باز نگه میداره هم میتونید تصویری از اپلیکیشن کنسولتون رو ببینید هم اگر تعدادشون زیاد بشه توی تسکبار پر کنسول نمیشه همچنین لازم نیست به صورت دستی کنسول ها رو باز کنید با باز کردن این اپ همه میکروسرویس ها اجرا میشن، کاری شبیه IIS انجام میده با این تفاوت که اپلیکیشن های شما خودشون پورت رو گوش میدن نه signalgo server manager بنابراین از این نظر سرعت بازدهی بهتری خواهید داشت چون iis خودش پورت رو گوش میده و اطلاعات رو به dll های شما از طریق application pol ارسال میکنه.بنابراین همیشه پردازش میکنه که اطلاعات از چه هاستی اومده و به کدوم پروژه باید بره همچنین بارگیری اطلاعات از طریق یک Stream مجزا سرعت بازدهی رو کمتر میکنه
Hello World
Hello Internet
سلام، با عرض پوزش خدمت دوستان بابت اینکه خیلی خیلی کم پست میذارم توی این کانال که گاهی اوقات باعث ریزش کاربران هم میشه، حقیقتا به خاطر چندتا مساله این کانال خیلی کم براش پست گذاشته میشه:
1.توی این کانال نمیخوام اخبار مایکروسافت و گوگل و تکنولوژی بذارم صرفا میخوام در مورد امکانات و فیچر ها و ساختار ها در برنامه نویسی صحبت بشه.
2.مطالب تکراری و غیر مرتبط از جایی کپی نکنم صرفا جهت اینکه بروز باشیم یا همیشه پست جدید داشته باشیم، در نتیجه تمام تلاشم رو میکنم مطالب رو خودم براتون بنویسم و خاص باشه برای همین اصراری به این نیست که مطالب رو از جایی یا کانال دیگه ای کپی کنم چون حدسم اینه که خودتون در کانال های دیگه عضو هستید و مطالبشون رو دنبال می کنید.
👍5