توی یک شرکتی کار میکنم که علاقه زیادی به استفاده از سیگنالگو نشون ندادن، شاید به خاطر عدم اعتمادشون به خودم که برنامه سیگنالگو هستم بود، میخوام چند تا از مشکلاتی که با تکنولوژی های روز کار میکنید رو خوردیم امروز براتون بگم.
پروژه روی 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
بعضی از قابلیت های سیگنالگو که شاید برای شما جالب باشد و برخی از آنها در داکیومنت ها یا آموزش ها نباشند که میتوانید از خودم بپرسید:
1.قابلیت ErrorHandling:
در سیگنالگو Duplex وقتی سرور با یک exception ای مواجه می شود آن را به سمت کلاینت ارسال میکند و برای کلاینت هم همان خطا throw میشود، اما اگر شما میخواهید به جای exception خوردن سمت کلاینت یک خروجی خاص مثل MessageContract با issuccess = false برگردونید میتونید از این قابلیت استفاده کنید و به صورت global یا customize خروجی متد رو همیشه بدون Exception به سمت کلاینت ارسال کنید، تنظیمات گلوبال سیگنالگو برای همه ی پروتکل ها مثل Rest ، Duplex ، Wesocket ، Oneway اعمال خواهند شد هرچند بازم توانایی شخصی سازی دارند.
2.توی سیگنال میتونید یک وبسایت رو به طور کامل به صورت Self-host بالا بیارید بدون نیاز به iis مثلا یک سایت انگولار
3.توی سیگنالگو میتونید یک متد گلوبال داشته باشید که وقتی کاربر فقط دامنه رو صدا میزنه اون متد Call میشه بدون اینکه ادرس Api رو بزنه.
4.وقتی دارید برای یک api مثل بانک callback میسازید ولی نمیدونید که اون بانک چه پارامتر هایی برمیگردونه میتونید یک تابع داشته باشید و پارامتر ها رو به صورت داینامیک بگیرید بعد پارسشون کنید.
5.شما میتونید برای سرویس ها و توابعتون محدودیت برای آی پی های خاص مشخص کنید
6.شما میتونید lock همزمانی برای متد ها یا سرویس هاتون بذارید.
7.یه قابلیتی به نام DisposableTransactionObjects وجود داره که توانایی اینو داره که آبجکت هایی که یادتون رفته dispose کنید رو براتون dispose میکنه، یا میتونید کاستوم کنید اگر آبجکتی رو یادتون رفته dispose کنید یا از using استفاده کنید بهتون خطا بده.
8.شما میتونید سریالایزر کاستوم برای ابجکت هایی که قابلیت سریالایز شدن به json ندارن بنویسید.
9.یک سرویس کامل Signalgo توانایی اینو داره که بدون تغییرات در کد به صورت کامل روی IIS هاست بشه.
10. با دو خط کد ناقابل سرویس های سیگنالگو رو تبدیل به بات تلگرام کنید.
11.به صورت Self-Host پروتکل Https رو روی سیگنالگو تنظیم کنید.
12.پکیج آزمایشی DataExchanger هم آمادست تا به شکل graph روی متد هاتون کوئری ارسال کنید.
13.توانایی Bind کردن داده های ورودی با Dto هاتون رو خواهید داشت که فقط یه سری دیتا از یک Dto سمت کلاینت ارسال یا دریافت بشه.
14.قابلیت Reference Resolver که لوپ رو توی مدل هاتون هندل میکنه و تا کلاینت هم لوپ ارسال و هندل میشه.
15.قابلیت کاستوم سازی جنریت کردن سرویس ها برای کلاینت مثلا سرویس های ادمین از سرویس های کلاینت جدا شوند و جنریشن برای هر کدوم جداگانه فقط توابع خودشون رو جنریت کنن.
16.قابلیت ساخت پارامتر Fake برای جلوگیری از کش مرورگر
17.ولیدیشن های خاص و قدرتمند روی پارامتر های ورودی سرویس ها و کلاس ها و پروپرتی هاشون
18.مدیریت کامل پروتکل Http به همراه header هایی که کاربران میفرستند و ساختن چیزهایی مثل Expire date برای session ها و ...
19.قابلیت ModelMapp برای کد جنریتور که باهاش میتونید مدل های سمت کلاینت رو کاستومایز کنید مثلا پروپتری بهش اضافه یا ازش کم کنید! یه قابلیت بسیار کاربردی برای کسانی که میخوان کلاینت و سرورشون رو کامل با سیگنالگو انجام بدن.
20.قابلیت Priority برای متد ها سمت کلاینت در صورت قطع شدن اتصال سمت کلاینت که در این صورت میتونید بهش بگید قبل از صدا زدن هر تابع اول لاگین مجدد انجام بشه برای ارتباط های Duplex که این امکان رو به شما میده همیشه کاربر برای صدا زدن توابع لاگین باشه
21.قابلیت فشرده سازی داده ها
22.مدیریت داده های بزرگ در وب سوکت به دلیل محدود بودن ارسال داده در این پروتکل
23.قابلیت کاستوم کردن امنیت تبادل اطلاعات بین کلاینت و سرور
24.قابلیت جنریت کردن اتوماتیک سمت کلاینت توسط Code Generator که به دو حالت Desktop App و VS Extension نوشته شده.
25.اپلیکیشن Desktop App سمت کلاینت برای تست سرویس های سرور که شبیه پستمن هست اما همه ی سرویس ها و کدهارو براتون جنریت میکنه و نیازی به درج و حذف اونا ندارید.
26.قابلیت جنریت کردن کد ها برای سی شارپ،فلاتر (دارت)، جاوا، انگولار،سوییفت و پستمن!
27.مدیریت و پیاده سازی Authentication به روش کاملا Customize
#SignalGo
@CSharpTips
1.قابلیت ErrorHandling:
در سیگنالگو Duplex وقتی سرور با یک exception ای مواجه می شود آن را به سمت کلاینت ارسال میکند و برای کلاینت هم همان خطا throw میشود، اما اگر شما میخواهید به جای exception خوردن سمت کلاینت یک خروجی خاص مثل MessageContract با issuccess = false برگردونید میتونید از این قابلیت استفاده کنید و به صورت global یا customize خروجی متد رو همیشه بدون Exception به سمت کلاینت ارسال کنید، تنظیمات گلوبال سیگنالگو برای همه ی پروتکل ها مثل Rest ، Duplex ، Wesocket ، Oneway اعمال خواهند شد هرچند بازم توانایی شخصی سازی دارند.
2.توی سیگنال میتونید یک وبسایت رو به طور کامل به صورت Self-host بالا بیارید بدون نیاز به iis مثلا یک سایت انگولار
3.توی سیگنالگو میتونید یک متد گلوبال داشته باشید که وقتی کاربر فقط دامنه رو صدا میزنه اون متد Call میشه بدون اینکه ادرس Api رو بزنه.
4.وقتی دارید برای یک api مثل بانک callback میسازید ولی نمیدونید که اون بانک چه پارامتر هایی برمیگردونه میتونید یک تابع داشته باشید و پارامتر ها رو به صورت داینامیک بگیرید بعد پارسشون کنید.
5.شما میتونید برای سرویس ها و توابعتون محدودیت برای آی پی های خاص مشخص کنید
6.شما میتونید lock همزمانی برای متد ها یا سرویس هاتون بذارید.
7.یه قابلیتی به نام DisposableTransactionObjects وجود داره که توانایی اینو داره که آبجکت هایی که یادتون رفته dispose کنید رو براتون dispose میکنه، یا میتونید کاستوم کنید اگر آبجکتی رو یادتون رفته dispose کنید یا از using استفاده کنید بهتون خطا بده.
8.شما میتونید سریالایزر کاستوم برای ابجکت هایی که قابلیت سریالایز شدن به json ندارن بنویسید.
9.یک سرویس کامل Signalgo توانایی اینو داره که بدون تغییرات در کد به صورت کامل روی IIS هاست بشه.
10. با دو خط کد ناقابل سرویس های سیگنالگو رو تبدیل به بات تلگرام کنید.
11.به صورت Self-Host پروتکل Https رو روی سیگنالگو تنظیم کنید.
12.پکیج آزمایشی DataExchanger هم آمادست تا به شکل graph روی متد هاتون کوئری ارسال کنید.
13.توانایی Bind کردن داده های ورودی با Dto هاتون رو خواهید داشت که فقط یه سری دیتا از یک Dto سمت کلاینت ارسال یا دریافت بشه.
14.قابلیت Reference Resolver که لوپ رو توی مدل هاتون هندل میکنه و تا کلاینت هم لوپ ارسال و هندل میشه.
15.قابلیت کاستوم سازی جنریت کردن سرویس ها برای کلاینت مثلا سرویس های ادمین از سرویس های کلاینت جدا شوند و جنریشن برای هر کدوم جداگانه فقط توابع خودشون رو جنریت کنن.
16.قابلیت ساخت پارامتر Fake برای جلوگیری از کش مرورگر
17.ولیدیشن های خاص و قدرتمند روی پارامتر های ورودی سرویس ها و کلاس ها و پروپرتی هاشون
18.مدیریت کامل پروتکل Http به همراه header هایی که کاربران میفرستند و ساختن چیزهایی مثل Expire date برای session ها و ...
19.قابلیت ModelMapp برای کد جنریتور که باهاش میتونید مدل های سمت کلاینت رو کاستومایز کنید مثلا پروپتری بهش اضافه یا ازش کم کنید! یه قابلیت بسیار کاربردی برای کسانی که میخوان کلاینت و سرورشون رو کامل با سیگنالگو انجام بدن.
20.قابلیت Priority برای متد ها سمت کلاینت در صورت قطع شدن اتصال سمت کلاینت که در این صورت میتونید بهش بگید قبل از صدا زدن هر تابع اول لاگین مجدد انجام بشه برای ارتباط های Duplex که این امکان رو به شما میده همیشه کاربر برای صدا زدن توابع لاگین باشه
21.قابلیت فشرده سازی داده ها
22.مدیریت داده های بزرگ در وب سوکت به دلیل محدود بودن ارسال داده در این پروتکل
23.قابلیت کاستوم کردن امنیت تبادل اطلاعات بین کلاینت و سرور
24.قابلیت جنریت کردن اتوماتیک سمت کلاینت توسط Code Generator که به دو حالت Desktop App و VS Extension نوشته شده.
25.اپلیکیشن Desktop App سمت کلاینت برای تست سرویس های سرور که شبیه پستمن هست اما همه ی سرویس ها و کدهارو براتون جنریت میکنه و نیازی به درج و حذف اونا ندارید.
26.قابلیت جنریت کردن کد ها برای سی شارپ،فلاتر (دارت)، جاوا، انگولار،سوییفت و پستمن!
27.مدیریت و پیاده سازی Authentication به روش کاملا Customize
#SignalGo
@CSharpTips
سیگنالگو 5.7 به همراه افزونه ی ویژوال استادیو 2022 منتشر شد.
امکانات اضافه شده به این نسخه:
1.توانایی ایجاد فایروال شخصی سازی شده
2.اضافه شدن قابلیت Key و PerSession به ConcurrentLockAttribute که توسط نوع Key شما می تونید بر اساس یک کلید خاصی لاک رو روی متد سرویس اعمال کنید و بر اساس PerSession به دو صورت میتونید لاک رو روی متد اعمال کنید.یک بر اساس سشن کاربر که یعنی فقط برای خود همون کاربر لاک انجام میشه دوم اگر مقدار Key رو با نام یکی از پارامتر های ورودی پر کنید لاک روی متد بر اساس سشن کاربر و مقدار ورودی که به پارامتر ارسال شده انجام میشه.کاربرد دومی خیلی ملموسه که موقع خرید کاربر نمی خواهید بقیه ی کاربرا منتظر و تو صف باشن ولی میخواهید اگر همون کاربر با همون ورودی دوبار متد رو صدا زد بره تو صف خودش 😉 کاربردش توی جلوگیری از عملیات همزمان موقع خرید کاربر هست و باعث میشه بقیه ی کاربرا به خاطر اون کاربر تو صف نباشن و فقط همون کاربر اگر متد رو دوبار همزمان صدا زد خودش فقط بره تو صف و کاراش تو صف انجام بشه
3.اضافه شدن فانکشن OnSendResponseToClientFunction که باهاش می تونید تمامی خروجی ها رو قبل از اینکه به سمت کلاینت برسه بررسی کنید یا تغییر بدید.
4.ساپورت gzip
#signalgo
@CsharpTips
امکانات اضافه شده به این نسخه:
1.توانایی ایجاد فایروال شخصی سازی شده
2.اضافه شدن قابلیت Key و PerSession به ConcurrentLockAttribute که توسط نوع Key شما می تونید بر اساس یک کلید خاصی لاک رو روی متد سرویس اعمال کنید و بر اساس PerSession به دو صورت میتونید لاک رو روی متد اعمال کنید.یک بر اساس سشن کاربر که یعنی فقط برای خود همون کاربر لاک انجام میشه دوم اگر مقدار Key رو با نام یکی از پارامتر های ورودی پر کنید لاک روی متد بر اساس سشن کاربر و مقدار ورودی که به پارامتر ارسال شده انجام میشه.کاربرد دومی خیلی ملموسه که موقع خرید کاربر نمی خواهید بقیه ی کاربرا منتظر و تو صف باشن ولی میخواهید اگر همون کاربر با همون ورودی دوبار متد رو صدا زد بره تو صف خودش 😉 کاربردش توی جلوگیری از عملیات همزمان موقع خرید کاربر هست و باعث میشه بقیه ی کاربرا به خاطر اون کاربر تو صف نباشن و فقط همون کاربر اگر متد رو دوبار همزمان صدا زد خودش فقط بره تو صف و کاراش تو صف انجام بشه
3.اضافه شدن فانکشن OnSendResponseToClientFunction که باهاش می تونید تمامی خروجی ها رو قبل از اینکه به سمت کلاینت برسه بررسی کنید یا تغییر بدید.
4.ساپورت gzip
#signalgo
@CsharpTips
👍4