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 هزارتومان مبلغ بالایی هست برای کسی که دارید انجام میدید بنابراین بهتره که توی این مواقع هزینه ها رو پروژه ای حساب کنید، کسانی که پروژه ها رو سریع انجام میدن ساعتی براشون نمیصرفه چون یا کارفرما فکر میکنه کار خیلی سادست یا شما خیلی هزینه رو بالا میگید.
این یعنی چی؟ یعنی یک پروژه بک اند توسط شما توی کمتر از 6 ساعت انجام میشه در حالی که ساعتی 500 هزارتومان مبلغ بالایی هست برای کسی که دارید انجام میدید بنابراین بهتره که توی این مواقع هزینه ها رو پروژه ای حساب کنید، کسانی که پروژه ها رو سریع انجام میدن ساعتی براشون نمیصرفه چون یا کارفرما فکر میکنه کار خیلی سادست یا شما خیلی هزینه رو بالا میگید.
مدیریت میکروسرویس ها با سیگنالگو توسط اپلیکیشنی به بنام SignalGo Server Manager انجام میشه این اپلیکیشن تمامی کنسول های میکرو سرویس های شما رو توی یک پروسه باز نگه میداره هم میتونید تصویری از اپلیکیشن کنسولتون رو ببینید هم اگر تعدادشون زیاد بشه توی تسکبار پر کنسول نمیشه همچنین لازم نیست به صورت دستی کنسول ها رو باز کنید با باز کردن این اپ همه میکروسرویس ها اجرا میشن، کاری شبیه IIS انجام میده با این تفاوت که اپلیکیشن های شما خودشون پورت رو گوش میدن نه signalgo server manager بنابراین از این نظر سرعت بازدهی بهتری خواهید داشت چون iis خودش پورت رو گوش میده و اطلاعات رو به dll های شما از طریق application pol ارسال میکنه.بنابراین همیشه پردازش میکنه که اطلاعات از چه هاستی اومده و به کدوم پروژه باید بره همچنین بارگیری اطلاعات از طریق یک Stream مجزا سرعت بازدهی رو کمتر میکنه
سلام، با عرض پوزش خدمت دوستان بابت اینکه خیلی خیلی کم پست میذارم توی این کانال که گاهی اوقات باعث ریزش کاربران هم میشه، حقیقتا به خاطر چندتا مساله این کانال خیلی کم براش پست گذاشته میشه:
1.توی این کانال نمیخوام اخبار مایکروسافت و گوگل و تکنولوژی بذارم صرفا میخوام در مورد امکانات و فیچر ها و ساختار ها در برنامه نویسی صحبت بشه.
2.مطالب تکراری و غیر مرتبط از جایی کپی نکنم صرفا جهت اینکه بروز باشیم یا همیشه پست جدید داشته باشیم، در نتیجه تمام تلاشم رو میکنم مطالب رو خودم براتون بنویسم و خاص باشه برای همین اصراری به این نیست که مطالب رو از جایی یا کانال دیگه ای کپی کنم چون حدسم اینه که خودتون در کانال های دیگه عضو هستید و مطالبشون رو دنبال می کنید.
1.توی این کانال نمیخوام اخبار مایکروسافت و گوگل و تکنولوژی بذارم صرفا میخوام در مورد امکانات و فیچر ها و ساختار ها در برنامه نویسی صحبت بشه.
2.مطالب تکراری و غیر مرتبط از جایی کپی نکنم صرفا جهت اینکه بروز باشیم یا همیشه پست جدید داشته باشیم، در نتیجه تمام تلاشم رو میکنم مطالب رو خودم براتون بنویسم و خاص باشه برای همین اصراری به این نیست که مطالب رو از جایی یا کانال دیگه ای کپی کنم چون حدسم اینه که خودتون در کانال های دیگه عضو هستید و مطالبشون رو دنبال می کنید.
👍5
C# Programming Guide pinned «سلام، با عرض پوزش خدمت دوستان بابت اینکه خیلی خیلی کم پست میذارم توی این کانال که گاهی اوقات باعث ریزش کاربران هم میشه، حقیقتا به خاطر چندتا مساله این کانال خیلی کم براش پست گذاشته میشه: 1.توی این کانال نمیخوام اخبار مایکروسافت و گوگل و تکنولوژی بذارم صرفا…»
توی سی شارپ استفاده از try همیشه به معنای catch کردن و جلوگیری از بروز خطا ها نیست گاهی اوقات شما میتونید فقط از try finally استفاده کنید تا کار خاصی رو انجام بدید و مطمئن بشید که اون قطعه کد داخل finally حتما اجرا میشه چه کد شما خطا داشته باشه چه نداشته باشه.
برای مثال شما میخواید یک قطعه کدی بزنید که ممکنه خطا داشته باشه ولی نمیخواید که توی همون متد خطا رو catch کنید یعنی میخواید از بیرون catch کنید ولی یک قطعه کدی رو میخواید بنویسید که در هر صورت اون اجرا بشه چه تابع شما به خطا بخوره چه نخوره.
یک مثال بارز این کد که در بالا نوشتم استفاده از کلیدواژه ی using هست.using در واقع تشکیل شده از یک try و finally بدون catch هست که تضمین میکنه که چه کد شما به خطا بخوره و چه نخوره تابع Dispose کلاس شمارو صدا بزنه.
@csharptips
برای مثال شما میخواید یک قطعه کدی بزنید که ممکنه خطا داشته باشه ولی نمیخواید که توی همون متد خطا رو catch کنید یعنی میخواید از بیرون catch کنید ولی یک قطعه کدی رو میخواید بنویسید که در هر صورت اون اجرا بشه چه تابع شما به خطا بخوره چه نخوره.
tryدر قطعه کد بالا اگر توی try به خطا برخورد کنید چون catch نکردید تابع به طور کامل break میشه تا زمانی که خارج از تابع catch داشته باشید ولی قطعه کد داخل finally حتما اجرا خواهد شد.مثلا برای dispose کردن یک dbContext یا یک استریم این میتونه براتون کاربردی باشه.البته اگر هم catch داشته باشید در هر دو صورت هم finally اجرا خواهد شد.
{
//your code
}
finally
{
//your code
}
یک مثال بارز این کد که در بالا نوشتم استفاده از کلیدواژه ی using هست.using در واقع تشکیل شده از یک try و finally بدون catch هست که تضمین میکنه که چه کد شما به خطا بخوره و چه نخوره تابع Dispose کلاس شمارو صدا بزنه.
@csharptips
کلاس های استاتیک اصولا کلاس های Single Instance هستند یعنی یکبار در حافظه ساخته میشن و تا اخر اجرای برنامه (یا لود بودن AppDomain) در حافظه میمونن،کانستراکتور های Static هم توی سی شارپ کاربرد های جالبی دارن مثلا هر وقت اون کلاس Static قرار بود یکبار توی حافظه ساخته بشه این کانستراکتور فقط یکبار توی کل روند برنامه صدا زده میشه، مثلا شما برای شروع یک Engine و یا Background worker میتونید از این کانستراکتور جالب استفاده کنید و داخلش job رو شروع کنید بدون اینکه نگران باشید که جایی لازم باشه متد Start رو صدا بزنید چون کلاس های استاتیک و کانستراکتور های استاتیک فقط وقتی بارگزاری میشن (یعنی یک Instance از کلاس ساخته میشه) که توی کد ازشون استفاده بشه و در روند اجرا شدن برنامه توی حافظه ساخته نمیشن بلکه فقط وقتی ساخته میشن که توی یک خط کدی ازش استفاده کنید.مثلا اگر کاربر روی یک دکمه کلیک کنه که توی متد اون دکمه از اون کلاس استاتیک استفاده کنید اینجا تازه اون کلاس استاتیک توی حافظه ساخته میشه و کانستراکتور استاکیش صدا زده میشه.
و همچنین اگر یک کلاس جنریک داشته باشید به ازای هر نوع مختلف از T یک Instance جداگونه از اون کلاس استاتیک و کانستراکتورش خواهید داشت، مثلا MyClass<int>.Name با MyClass<string>.Name مقادیرش توی حافظه مختلف خواهند بود ولی هر کدام Static هستند و یکبار در حافظه ساخته شدند و کانستراکتور های خودشون رو هم دارند.
#سی_شارپ
#Static
#CSharp
@CsharpTips
و همچنین اگر یک کلاس جنریک داشته باشید به ازای هر نوع مختلف از T یک Instance جداگونه از اون کلاس استاتیک و کانستراکتورش خواهید داشت، مثلا MyClass<int>.Name با MyClass<string>.Name مقادیرش توی حافظه مختلف خواهند بود ولی هر کدام Static هستند و یکبار در حافظه ساخته شدند و کانستراکتور های خودشون رو هم دارند.
#سی_شارپ
#Static
#CSharp
@CsharpTips
تقلید چیز خوبی نیست، نه در دین و نه در برنامه نویسی، تقلید چیزیه که انسان رو گمراه میکنه، آدم باید خودش به حقیقت برسه و تقلید چیزیه که باعث تعصب میشه اگر ما از یک سری ساختار در برنامه نویسی به عنوان استاندارد جهانی تقلید میکنیم خودبخود برای اینکه اون ساختار رو برای کسی توجیه کنیم و یا توضیح بدیم میگیم این یک "استاندارده" و همه دارن ازش استفاده میکنن من به شخصیه با این قضیه به شدت مخالفم، هیچ استانداردی وجود نداره و اگر داره، کاری که شما میکنید، ساختاری که شما میچینید هم میتونه یک استاندارد باشه و اینکه کلا جهان ساختار شمارو متوجه نمیشن به این معنی نیست که شما نمیفهمید یا در اشتباهید بلکه به این معنی میتونه باشه که شما از اینده اومدید و تفکری پیشتازتر دارید.
توی برنامه نویسی اصلا دوست ندارم از ساختار و استاندارد های دیگران استفاده کنم همه چیز توی ذهن من به طور پیشفرض مسیر اشتباهی رو طی میکنن مگر اینکه دلیل منطقی ای براش باشه، استفاده از کلمه های استاندارد جهانی یا چیزی که همه قبولش دارن برای من سیستم و درست بودن ساختار رو توجیه نمی کنه، اگر اینطور فکر کنید همیشه برای کارهایی که میکنید راه کار های بهتر و راحت تر به ذهنتون میرسه، متفاوت فکر کردن اشتباه نیست همه ی تکنولوژی ها ایده ها و ساختار های جدید وقتی تولید شدن که افراد متفاوت فکر کردن. متفاوت فکر کردن که دات نت کور ساخته شد متفاوت فکر کردن که برق اختراع شد متفاوت فکر کردن که هواپیما اختراع شد و دنیا رو متحول کردن.
استاندارد خودتون رو داشته باشید، شاید یه روزی اونی که دنیا رو متحول میکنه شما باشید.
آرزوی موفقیت.
#تقلید
#استاندارد
@CsharpTips
توی برنامه نویسی اصلا دوست ندارم از ساختار و استاندارد های دیگران استفاده کنم همه چیز توی ذهن من به طور پیشفرض مسیر اشتباهی رو طی میکنن مگر اینکه دلیل منطقی ای براش باشه، استفاده از کلمه های استاندارد جهانی یا چیزی که همه قبولش دارن برای من سیستم و درست بودن ساختار رو توجیه نمی کنه، اگر اینطور فکر کنید همیشه برای کارهایی که میکنید راه کار های بهتر و راحت تر به ذهنتون میرسه، متفاوت فکر کردن اشتباه نیست همه ی تکنولوژی ها ایده ها و ساختار های جدید وقتی تولید شدن که افراد متفاوت فکر کردن. متفاوت فکر کردن که دات نت کور ساخته شد متفاوت فکر کردن که برق اختراع شد متفاوت فکر کردن که هواپیما اختراع شد و دنیا رو متحول کردن.
استاندارد خودتون رو داشته باشید، شاید یه روزی اونی که دنیا رو متحول میکنه شما باشید.
آرزوی موفقیت.
#تقلید
#استاندارد
@CsharpTips
Forwarded from C# Friends (Mr.Grayhat)
ساختارها(structure)،تفکر ها و الگوهای (patterns) برنامه نویسی برای این ساخته و برخی استاندارد شده اند تا طراحی و پیاده سازی زیرساخت و برنامه ها اسون تر و قابل فهم تر باشن. به شکلی که بقیه برنامه نویس ها بتونن پروژه شمارو درک کنن و توسعه بدن بدون اینکه بخوان همش با سازنده در ارتباط باشن و داکیومنت های مختلف بخوان، روی توسعه تمرکز کنن.
فریم ورک هایی مثل ABP,asp.net zero وجود دارن که زیرساخت اپلیکیشن رو از پیش پی ریزی کردن، به عنوان مثال مباحث احراز هویت، سرویس ها و دیتابیس(ef) و یک رابط کاربری پیش فرض که هم نسخه angular و هم و mvc ajax داره که پیشفرض برپایه SPA هست.
فریمورک abp بر پایه معماری و تفکر DDD و الگوهایی مثل Dependency injection همراه قابلیت هاو پترن های دیگه ای مثل auto mapper, entity framework, identity, service injection و ...که برخی توسط خود abp کاستوم شده و قابلیت extensions هایی بهشون اضافه شده که چهارتاشم بیشتر استفاده نمیکنین حالا ولی خوبن.
پروژه ها و لایه هاتون. برای هر کدوم شما دامین ها و dto هاتون رو پیاده سازی میکنید. logic و سرویس هاتون رو مینویسید و اینترفیس هاتون رو برای هر کدوم تعریف میکنید، همچنین از برخی کلاس ها و اینترفیس های abp ارث بری میکنید مثل application service و crud تا براتون سرویس های restful ساخته بشه و عملیات های کلاینتتون رو انجام بدین.
اگه میخواین یکمتمیز تر باشین لایه های core, contract و shared رو برای شما گزاشتن.
البته یادتون نره کامنتم بزنین بلکه یکی دیگم بفهمه!
دیتابیس تون و جداولتون رو مینویسین و به کاستوم مپ auto mapper میفهمونین( یا حداقل سعی میکنین بفهمونین) که باید با چه DTO هایی در ارتباط باشه. یک طرفه باشه یا دو reverse یا همشو؟!
مدلهای dto صفحه بندی شده paged با ارث بری از کلاس های پیشفرضش میسازید و خواص، فیلتر ها رو برای سرچ تعیین میکنین(اگر به Paging و Huge List ها نیاز هست)
مباحثی مثل نقش ها و دسترسی ها، چند مستاجری (Tenant) و چند زبانی (multi linguql) پیشفرض وجود داره و میتونین کانفیگ کنین.
وقتی backend رو پیاده کردین نسخه کلاینت رو میگیرین. آنگولار یا mvc/jquery
با استفاده از swagger و اسکریپت خودش، میتونین تمام dtoهای سرویس هاتون رو برای کلاینت بسازید(Generate) و شروع به نوشتن کامپوننت و سرویس هاتون برای استفاده بکنین و از شیوه خودش بهره ببرین به لطف type script.
اگر آنگولار رو برای ui انتخاب میکنین باید حوصله بیشتری خرج کنین، پکیج ها و کتابخونه ها رو با npm یا yarn نصب و اپدیت کنین(اپدیت پیشنهاد نمیشه این اول چون احتمال سفید شدن موهاتون زیاده تا کانفلیکت ها و compatibility ها رو تنظیم کنین. به نسخه ۹ که اصن هیییچ) و از داکیومنت های بی انتهای abp یا zero بهره ببرید تا منوها، صفحه ها و سرویس هاتون رو توسعه بدین.
باشد تا متوجه شوید که هر کدوم چکار میکنن.
اگر Mvc رو انتخاب میکنین باید با js و jquery سر و کله بزنین و کلاینتتون رو برای اسفاده طراحی کنین. مواظب باشین دچار سندروم جاوا اسکریپت نشین!!
ویژوال استادیو هم هنوز یکم نفهمه درست جاوا اسکریپت نمیفهمه.
vscode پیشنهاد میکنم برای هر دو.
تا اینجای کار که بدک نیست و سریع میشه پروژه زد و توسعه داد و فیچر هارو بالای هم چید و پابلیش بدیم مشتری حال کنه مام حال کنیم با یک عالمه کد :)
در یک پست دیگه منظورم رو کاملتر میگم و از اندک تجربم هم براتون بیشتر مینویسم.
@csharpfriends @CsharpTips
فریم ورک هایی مثل ABP,asp.net zero وجود دارن که زیرساخت اپلیکیشن رو از پیش پی ریزی کردن، به عنوان مثال مباحث احراز هویت، سرویس ها و دیتابیس(ef) و یک رابط کاربری پیش فرض که هم نسخه angular و هم و mvc ajax داره که پیشفرض برپایه SPA هست.
فریمورک abp بر پایه معماری و تفکر DDD و الگوهایی مثل Dependency injection همراه قابلیت هاو پترن های دیگه ای مثل auto mapper, entity framework, identity, service injection و ...که برخی توسط خود abp کاستوم شده و قابلیت extensions هایی بهشون اضافه شده که چهارتاشم بیشتر استفاده نمیکنین حالا ولی خوبن.
پروژه ها و لایه هاتون. برای هر کدوم شما دامین ها و dto هاتون رو پیاده سازی میکنید. logic و سرویس هاتون رو مینویسید و اینترفیس هاتون رو برای هر کدوم تعریف میکنید، همچنین از برخی کلاس ها و اینترفیس های abp ارث بری میکنید مثل application service و crud تا براتون سرویس های restful ساخته بشه و عملیات های کلاینتتون رو انجام بدین.
اگه میخواین یکمتمیز تر باشین لایه های core, contract و shared رو برای شما گزاشتن.
البته یادتون نره کامنتم بزنین بلکه یکی دیگم بفهمه!
دیتابیس تون و جداولتون رو مینویسین و به کاستوم مپ auto mapper میفهمونین( یا حداقل سعی میکنین بفهمونین) که باید با چه DTO هایی در ارتباط باشه. یک طرفه باشه یا دو reverse یا همشو؟!
مدلهای dto صفحه بندی شده paged با ارث بری از کلاس های پیشفرضش میسازید و خواص، فیلتر ها رو برای سرچ تعیین میکنین(اگر به Paging و Huge List ها نیاز هست)
مباحثی مثل نقش ها و دسترسی ها، چند مستاجری (Tenant) و چند زبانی (multi linguql) پیشفرض وجود داره و میتونین کانفیگ کنین.
وقتی backend رو پیاده کردین نسخه کلاینت رو میگیرین. آنگولار یا mvc/jquery
با استفاده از swagger و اسکریپت خودش، میتونین تمام dtoهای سرویس هاتون رو برای کلاینت بسازید(Generate) و شروع به نوشتن کامپوننت و سرویس هاتون برای استفاده بکنین و از شیوه خودش بهره ببرین به لطف type script.
اگر آنگولار رو برای ui انتخاب میکنین باید حوصله بیشتری خرج کنین، پکیج ها و کتابخونه ها رو با npm یا yarn نصب و اپدیت کنین(اپدیت پیشنهاد نمیشه این اول چون احتمال سفید شدن موهاتون زیاده تا کانفلیکت ها و compatibility ها رو تنظیم کنین. به نسخه ۹ که اصن هیییچ) و از داکیومنت های بی انتهای abp یا zero بهره ببرید تا منوها، صفحه ها و سرویس هاتون رو توسعه بدین.
باشد تا متوجه شوید که هر کدوم چکار میکنن.
اگر Mvc رو انتخاب میکنین باید با js و jquery سر و کله بزنین و کلاینتتون رو برای اسفاده طراحی کنین. مواظب باشین دچار سندروم جاوا اسکریپت نشین!!
ویژوال استادیو هم هنوز یکم نفهمه درست جاوا اسکریپت نمیفهمه.
vscode پیشنهاد میکنم برای هر دو.
تا اینجای کار که بدک نیست و سریع میشه پروژه زد و توسعه داد و فیچر هارو بالای هم چید و پابلیش بدیم مشتری حال کنه مام حال کنیم با یک عالمه کد :)
در یک پست دیگه منظورم رو کاملتر میگم و از اندک تجربم هم براتون بیشتر مینویسم.
@csharpfriends @CsharpTips
Signalgo version 5.5.5 released:
1.Support for custom compression and decompression
2.Fix some bugs
https://www.nuget.org/packages/SignalGo.Net.Server/
https://www.nuget.org/packages/SignalGo.Net.Client/
1.Support for custom compression and decompression
2.Fix some bugs
https://www.nuget.org/packages/SignalGo.Net.Server/
https://www.nuget.org/packages/SignalGo.Net.Client/
www.nuget.org
SignalGo.Net.Server 5.5.5
Documentation and samples:
https://github.com/SignalGo/SignalGo-full-net/wiki
SignalGo is a library for Cross-Platform developers that makes it incredibly simple to add real-time web functionality to your applications. What is "real-time web" functionality?…
https://github.com/SignalGo/SignalGo-full-net/wiki
SignalGo is a library for Cross-Platform developers that makes it incredibly simple to add real-time web functionality to your applications. What is "real-time web" functionality?…
دو نوع برنامه نویس داریم:
1.برنامه نویس هایی که چرخ ها رو از اول اختراع می کنن
2. برنامه نویس هایی که از چرخ هایی که دیگران استفاده کردند برای توسعه اپلیکیشن هاشون استفاده میکنن.
من توی دسته ی اول هستم.شاید از دیدگاه شما جالب نباشه و همیشه با خودتون فکر کنید که وقتی توی دسته ی دوم قرار بگیرید میتونید سریعتر کد بزنید و سریعتر توسعه بدید.
اما دسته ی دوم دوتا مشکل داره:
1.محدودیت
2.وابستگی
اگر برنامه نویس حرفه ای باشید میدونید چه وقتهایی باید توی دسته ی اول قرار بگیرید و چه وقتهایی باید توی دسته ی دوم قرار بگیرید. دقیقا وقتی باید چرخ رو اختراع کنید که:
1.محدودیت زیادی توی استفاده از کامپوننت دارید مثل باگ، فیچر ها و ...
2.احساس کنید اختراع چرخ از استفاده از کامپوننت بقیه سریعتر اتفاق میوفته
برای مثال ما یک جا توی شرکت بنا شد قسمتی از پروژه رو از دیتابیس No Sql استفاده کنیم، خب طبق معمول همه پیشنهاد دادن بریم سراغ Mongo db در حالی که من میدونستم نوشتن چیزی مثل دیتابیس No Sql برای من زیاد طول نمی کشه فلذا باهاشون مخالفت کردم و توی کمتر از 8 ساعت دیتابیس No Sql زدم و توی کمتر از یک هفته هم Provider اش رو برای EF Core زدم تا با کمترین تغییرات سیستممون لانچ بشه و شد.
اما مزیت این چی بود؟
1. سرعت
2.بسیار سبک و سریع در حد سه تا کلاس سی شارپ (بدون در نظر گرفتن Provider)
3.تجربه و اعتماد
4.عدم وابستگی و محدودیت
5.بدون نیاز به تغییرات خاص
اما میدونم چه جاهایی واقعا وقتم توی اختراع یک چرخ گرفته میشه و نباید ریسک کنم اینکار بسیار لذت بخشه اگر توی کار سریع باشید دیگه هیچی جلوی شمارو توی کد زدن نمیگیره و همچنین برنامه نویس هایی که کنارتون کار میکنن و حتی خودتون همیشه در حال یاد گرفتن هستید و یاد گرفتن خیلی مهم و لذت بخشه.
1.برنامه نویس هایی که چرخ ها رو از اول اختراع می کنن
2. برنامه نویس هایی که از چرخ هایی که دیگران استفاده کردند برای توسعه اپلیکیشن هاشون استفاده میکنن.
من توی دسته ی اول هستم.شاید از دیدگاه شما جالب نباشه و همیشه با خودتون فکر کنید که وقتی توی دسته ی دوم قرار بگیرید میتونید سریعتر کد بزنید و سریعتر توسعه بدید.
اما دسته ی دوم دوتا مشکل داره:
1.محدودیت
2.وابستگی
اگر برنامه نویس حرفه ای باشید میدونید چه وقتهایی باید توی دسته ی اول قرار بگیرید و چه وقتهایی باید توی دسته ی دوم قرار بگیرید. دقیقا وقتی باید چرخ رو اختراع کنید که:
1.محدودیت زیادی توی استفاده از کامپوننت دارید مثل باگ، فیچر ها و ...
2.احساس کنید اختراع چرخ از استفاده از کامپوننت بقیه سریعتر اتفاق میوفته
برای مثال ما یک جا توی شرکت بنا شد قسمتی از پروژه رو از دیتابیس No Sql استفاده کنیم، خب طبق معمول همه پیشنهاد دادن بریم سراغ Mongo db در حالی که من میدونستم نوشتن چیزی مثل دیتابیس No Sql برای من زیاد طول نمی کشه فلذا باهاشون مخالفت کردم و توی کمتر از 8 ساعت دیتابیس No Sql زدم و توی کمتر از یک هفته هم Provider اش رو برای EF Core زدم تا با کمترین تغییرات سیستممون لانچ بشه و شد.
اما مزیت این چی بود؟
1. سرعت
2.بسیار سبک و سریع در حد سه تا کلاس سی شارپ (بدون در نظر گرفتن Provider)
3.تجربه و اعتماد
4.عدم وابستگی و محدودیت
5.بدون نیاز به تغییرات خاص
اما میدونم چه جاهایی واقعا وقتم توی اختراع یک چرخ گرفته میشه و نباید ریسک کنم اینکار بسیار لذت بخشه اگر توی کار سریع باشید دیگه هیچی جلوی شمارو توی کد زدن نمیگیره و همچنین برنامه نویس هایی که کنارتون کار میکنن و حتی خودتون همیشه در حال یاد گرفتن هستید و یاد گرفتن خیلی مهم و لذت بخشه.
C# Programming Guide
نسخه ی جدید سیگنالگو با قابلیت query زدن در خروجی و ورودی های متدهاتون در حال توسعه هست. توی این نسخه همونطور که در تصویر میبینید میتونید هر نوع کوئری رو حتی از سمت کلاینت برای سرور بزنید یا از سمت سرور برای کلاینت بزنید و ... در واقع ما شکل ساده تر DataExchanger…
سوال یکی از کاربران در مورد Query و Data Exchanger توی سیگنالگو که نسخه ی آزمایشی اون رو توی Nuget منتشر کردم:
https://github.com/SignalGo/SignalGo-full-net/issues/26
https://github.com/SignalGo/SignalGo-full-net/issues/26
GitHub
Queryable DataExchanger Example · Issue #26 · SignalGo/SignalGo-full-net
I am trying to run the sample and it is asking for the query as a parameter. What is a sample query to send and where can I find out more information on what can be sent? Thanks -Tim
یکی از قابلیت هایی که جدیدا به سیگنالگو اضافه شده قابلیت جنریت کردن خروجی های سرویس ها برای سمت کلاینت با قابلیت حفظ نام برای Value Tuple های سی شارپ 7 هست.توی این نسخه نام های ValueTuple ها موقعی که برای سمت کلاینت جنریت میشن حفظ میشن و زیبایی کد ها حفظ میشه
@csharptips
@csharptips
ویدئوی آموزش سیگنالگو در لینوکس که توسط دوست و همکار عزیزم آقای سعید رضایی @mrgrayhat ساخته شده که میتونید توسط این آموزش یاد بگیرید که توی لینوکس چطوری یک سرور و کلاینت سیگنالگو رو با ویژوال استادیو کد و سیگنالگو کد جنریتور بسازید.
https://www.youtube.com/watch?v=WzbYpTiH2L8
https://www.youtube.com/watch?v=WzbYpTiH2L8
YouTube
SignalGo simple service tutorial in Linux
learn more:
https://github.com/SignalGo/SignalGo-full-net
https://github.com/SignalGo/SignalGo-full-net
کانال رسمی Signalgo Publisher :
پروژه ای که برای مدیریت و آپلود میکروسرویس های سیگنالگو بهتون کمک میکنه و قراره جایگزینی برای Docker و kubernetes باشه.بخش هایی که تا به امروز انجام شده و قابل استفاده است:
1.کامپیل کردن پروژه
2.اجرای تست های پروژه
3.پابلیش کردن پروژه روی سرور در صورت ی که تست ها Pass بشن
4.میتونید سرور های مختلفی داشته باشید، مثلا سرور های تست و اصلی که روی هر کدوم خواستید سلوشن هاتون رو پابلیش کنید.
5.و خیلی امکانات دیگه
هدف این بوده که برنامه نویس ها با کمترین دانش و بیشترین سرعت بتونن سرویس هاشون رو سریع روی سرور های مورد نظرشون پابلیش کنن.
https://t.iss.one/PublisherGo
پروژه ای که برای مدیریت و آپلود میکروسرویس های سیگنالگو بهتون کمک میکنه و قراره جایگزینی برای Docker و kubernetes باشه.بخش هایی که تا به امروز انجام شده و قابل استفاده است:
1.کامپیل کردن پروژه
2.اجرای تست های پروژه
3.پابلیش کردن پروژه روی سرور در صورت ی که تست ها Pass بشن
4.میتونید سرور های مختلفی داشته باشید، مثلا سرور های تست و اصلی که روی هر کدوم خواستید سلوشن هاتون رو پابلیش کنید.
5.و خیلی امکانات دیگه
هدف این بوده که برنامه نویس ها با کمترین دانش و بیشترین سرعت بتونن سرویس هاشون رو سریع روی سرور های مورد نظرشون پابلیش کنن.
https://t.iss.one/PublisherGo
Telegram
SignalGo Publisher/ServerManager
All publisher and server manager releases and change logs, archived here.
Contact: @mrgrayhat @Ali_Visual_Studio
Contact: @mrgrayhat @Ali_Visual_Studio
#تخصصی
#پرفورمنس
#حرفه_ای
#سی_شارپ
نوع و طریقه استفاده از متغیر ها میتونه توی پرفورمنس تاثیر بسزایی داشته باشه، همه میدونیم دسترسی مقادیر به حافظه stack سریعتر از حافظه heap هست چون برای دسترسی به حافظه heap نیاز به یک اشاره گر در حافظه stack داریم در حالی که مقادیر value type ها به خودی خود اشاره به مقدار اون در حافظه stack میکنن، مثل این میمونه که شما مستقیم از شیر آب، آب بنوشید یا ابتدا آب رو توی یک لیوان بریزید سپس اون رو بنوشید. خب مسلما راه سریعتر برای سیراب شدن خوردن آب از شیر هست.
حالا شما فرض کنید میخواهید یک حلقه ای رو به تعداد ایتم های یک پروپرتی در یک کلاس بچرخونید و عملیات محاسباتی توش انجام بدید. اگر شما به این شکل حلقه رو بنویسید:
هر باری که حلقه میخواد ببینه به پایان رسیده یا نه مجبوره i رو با مقدار test1.Items.Count چک کنه و این یکم مشکل پرفورمنسی داره، چرا؟ چون توی قسمت test1 ابتدا باید یک اشاره به پوینتر کلاس توی حافظه استک کنه سپس بر اساس اون بره توی حافظه ی Heap و اشاره کنه به Items سپس اشاره کنه به Count این عملیات هر بار که شرط حلقه ی شما اجرا بشه اتفاق میوفته و شاید شما بگید چیز خاصی نیست ولی یک برنامه نویس بکند اگر هزاران خط کد اینشکلی داشته باشه که میلیون ها کلاینت دارن همزمان از این عملیات استفاده میکنن، اونوقت فاجعه افت پرفورمنس رو به وفور خواهید دید و با رعایت این مسائل براحتی میتونید پرفورمنس بهتری توی بکند داشته باشید
برای حل این مشکل باید چیکار کنیم؟
کاری که باید بکنیم اینه که ابتدا مقدار مورد نظر رو در یک حافظه Stack میریزیم.سپس به حلقه اجازه میدیم که مستقیم با همون متغیر که توی stack هست کار کنه.
به این شکل:
@csharptips
#پرفورمنس
#حرفه_ای
#سی_شارپ
نوع و طریقه استفاده از متغیر ها میتونه توی پرفورمنس تاثیر بسزایی داشته باشه، همه میدونیم دسترسی مقادیر به حافظه stack سریعتر از حافظه heap هست چون برای دسترسی به حافظه heap نیاز به یک اشاره گر در حافظه stack داریم در حالی که مقادیر value type ها به خودی خود اشاره به مقدار اون در حافظه stack میکنن، مثل این میمونه که شما مستقیم از شیر آب، آب بنوشید یا ابتدا آب رو توی یک لیوان بریزید سپس اون رو بنوشید. خب مسلما راه سریعتر برای سیراب شدن خوردن آب از شیر هست.
حالا شما فرض کنید میخواهید یک حلقه ای رو به تعداد ایتم های یک پروپرتی در یک کلاس بچرخونید و عملیات محاسباتی توش انجام بدید. اگر شما به این شکل حلقه رو بنویسید:
for (int i = 0; i < test1.Items.Count; i++)
{
}
هر باری که حلقه میخواد ببینه به پایان رسیده یا نه مجبوره i رو با مقدار test1.Items.Count چک کنه و این یکم مشکل پرفورمنسی داره، چرا؟ چون توی قسمت test1 ابتدا باید یک اشاره به پوینتر کلاس توی حافظه استک کنه سپس بر اساس اون بره توی حافظه ی Heap و اشاره کنه به Items سپس اشاره کنه به Count این عملیات هر بار که شرط حلقه ی شما اجرا بشه اتفاق میوفته و شاید شما بگید چیز خاصی نیست ولی یک برنامه نویس بکند اگر هزاران خط کد اینشکلی داشته باشه که میلیون ها کلاینت دارن همزمان از این عملیات استفاده میکنن، اونوقت فاجعه افت پرفورمنس رو به وفور خواهید دید و با رعایت این مسائل براحتی میتونید پرفورمنس بهتری توی بکند داشته باشید
برای حل این مشکل باید چیکار کنیم؟
کاری که باید بکنیم اینه که ابتدا مقدار مورد نظر رو در یک حافظه Stack میریزیم.سپس به حلقه اجازه میدیم که مستقیم با همون متغیر که توی stack هست کار کنه.
به این شکل:
int len = test1.Items.Count;
for (int i = 0; i < len; i++)
{
}
@csharptips
Forwarded from کدهک