توی یک شرکتی کار میکنم که علاقه زیادی به استفاده از سیگنالگو نشون ندادن، شاید به خاطر عدم اعتمادشون به خودم که برنامه سیگنالگو هستم بود، میخوام چند تا از مشکلاتی که با تکنولوژی های روز کار میکنید رو خوردیم امروز براتون بگم.
پروژه روی 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
پروژه روی 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
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 هزارتومان مبلغ بالایی هست برای کسی که دارید انجام میدید بنابراین بهتره که توی این مواقع هزینه ها رو پروژه ای حساب کنید، کسانی که پروژه ها رو سریع انجام میدن ساعتی براشون نمیصرفه چون یا کارفرما فکر میکنه کار خیلی سادست یا شما خیلی هزینه رو بالا میگید.
این یعنی چی؟ یعنی یک پروژه بک اند توسط شما توی کمتر از 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