TG Telegram Group Link
Channel: Easy Microservices
Back to Bottom
Easy Microservices
سلام عزیزان دل. پکیج های سری لاگ رو هم اضافه کردیم با سه تا از محبوبترین پکیج های لاگر توی دات نت: Serilog NLog log4net سورس: https://github.com/EasyMicroservices/Logger @easymicroservices @easymicroservice @csharptips
توابع:
Verbose
Debug
Information
Warning
Error
Fatal

حالا چرا ورودی رو params object[] گرفتیم؟
چون میخواستیم شما نگران این نباشید که exception یا text یا ابجکت هاتون رو توی کدوم پارامتر میفرستید. ما خودتمون توی زیرساخت اونارو مرتب میکنیم و به تامین کننده ی لاگیر شما میفرستیم تا لاگش کنه.
شما فقط صدا بزن.
کاملا منطقی بود
آیا ایمان نمی آورید؟ 😁

@easymicroservice
@easymicroservices
@csharptips
Easy Microservices
Photo
در معماری CQRS هدف اصلی اینه که دیتابیس های Read از دیتابیس های Write از هم جدا بشن.
اما «نوع و روش» پیاده سازی این معماری از نظر من یک over engineering هست که به ازای هر مدل شما سه تا کلاس اضافه باید بسازید تا به هدف اصلی خودتون برسید که در اصل باعث پیچیدگی بیشتر پروژه میشه.

حالا بذارید چندتا سوال بپرسیم:
1. اگر در ابتدای پروژه خواستید یک MVP تحویل بدید چی؟ بازم می‌خواهید به ازای هر مدل چند کلاس Command و Query بسازید؟
2. اگر در یک آینده ی دور خواستید دیتابیس Read و Write رو جدا کنید چی (یعنی الان قصدش رو ندارید)؟ همین امروز باید کلی کد بزنید و کلاس بسازید؟

همه‌ی این معماری ها برای پیاده سازی خوب هستند اما روش پیاده سازی کاملا به شما و تجربیات شما بستگی داره.

در هسته ی Easy Microservices دو تابع GetReadableOf و GetWritableOf وجود داره که در ابتدای کار اصلا کاری به این نداره که دیتابیس Read از Write جدا بشه. شما می‌تونید در آینده هر وقت خواستید این دو رو از هم جدا کنید بدون تغییر کدهاتون و اضافه و کم کردن چیزی توی ساختار، این تغییرات رو اعمال کنید.بنابراین تا شما نگران این موضوع نشید این دو تابع در ابتدا تقریبا یک کار یکسان رو انجام میدن. همچنین مدیریت AsNoTracking توی EF Core برای پرفورمنس بهتر توی این مساله دیده شده. بنابراین هر وقت که خواستید دیتابیس هارو جدا کنید با یک تغییر کوچیک به دو کانکشن متفاوت دیتابیس‌ها جدا شده و این دو تابع و عملکرد خودشون رو نشون میدن.

معماری فقط راه حل نیست، بلکه مهمتر از اون روش پیاده سازی اون راه حل ارائه شده هست.

با ما همراه باشید.
@easymicroservice
@easymicroservices
@csharptips
کلیات کاری که تا الان کردیم، این سیستم درسته بر پایه‌ی مایکروسرویس ساخته شده اما شما حتی برای شروع یک پروژه‌ی MVP می‌تونید از این زیرساخت استفاده کنید و حتی مدیریتش دقیقا مثل پروژه‌های مونولیت که در ابتدای کار آسونه اینم آسونه. در ابتدای کار نه سرور vps نیاز دارید، نه داکر نیاز دارید نه gateway و غیره. حتی یک هاست برای اجرای میکروسرویس های شما کافیه.
هدف ما آسون کردن توسعه‌ی نرم افزار هاست.

@easymicroservice
@easymicroservices
@csharptips
خلاصه‌ای از معماری میکروفرانتی که ما توی Easy Microservices در حال پیاده سازی اون هستیم. و تقریبا پکیج‌های فرانت رو برای میکروسرویس Ordering آماده کردیم.
برای مثال اگر زیرساخت این معماری رو با سی شارپ بنویسید شما تکنولوژی های زیر رو دارید:
1.WPF
2.Blazor
3.MAUI
یا هرچی.
اگر شما میخواهید در وبسایت خودتون مدیریت محصولات داشته باشید.
پکیج کامپوننت مدیریت محصولات رو نصب میکنید، آدرس Api میکروسرویس محصولات رو به کامپوننت میدید و تمام.
کامپوننت مدیریت محصولات به پروژه‌ی شما اضافه شد و قابل استفاده هست و کاربران می‌تونن محصولات اضافه،حذف و آپدیت کنند یا توی محصولات جستجو انجام بدن.

@Easymicroservices
@Easymicroservice
@CSharptips
تابع AutoModelCreating در هسته‌ی EasyMicroservices برای شما همه‌ی ریلیشن‌ها رو پیدا میکنه و اتوماتیک جداول رو به هم به صورت Fluent ریلیشن میزنه.

@EasyMicroservices
@EasyMicroservice
@CsharpTips
دو تابع جدید به هسته‌ی Api اضافه کردیم. این توابع وظیفه‌ی بروزرسانی رو مثل تابع Update بر عهده دارن منتهی فرقش اینه که اگر مقادیر پروپرتی‌های کلاسی که میخواهید آپدیت کنید رو به صورت پیشفرض بفرستید اونا آپدیت نمیشن. در حالی که در متد Update هر مقداری که توی ورودی وجود داره بروزرسانی خواهد شد چه شما پرش کنید و چه پرش نکنید.

مقادیر پیشفرض یعنی چی؟
برای مثال مقدار پیشفرض اعداد 0 و بسته به نوع value type هست و مقدار پیشفرض کلاس‌ها (reference type) و String ها نال (null) هست.

مزیت این تابع اینه که یه سری پارامتر ها وقتی میخواید به میکروسرویس ارسال کنید لازم نباشه حتما یک فانکشن جدا براش بسازید برای مسائل MVP سریع میتونید یه آپدیت بدید و ممکنه پارامتر های رابط کاربری کمتر از پارامتر های سرویس باشه، بنابراین همون چندتا پارامتر رو طرف آپدیت میکنه و بقیه پارامتر ها تا نسخه ی بعدی فرانت همچنان قابلیت آپدیت و تغییر توشون وجود نخواهد داشت.

@EasyMicroservices
@EasyMicroservice
@CSharpTips
Easy Microservices
دو تابع جدید به هسته‌ی Api اضافه کردیم. این توابع وظیفه‌ی بروزرسانی رو مثل تابع Update بر عهده دارن منتهی فرقش اینه که اگر مقادیر پروپرتی‌های کلاسی که میخواهید آپدیت کنید رو به صورت پیشفرض بفرستید اونا آپدیت نمیشن. در حالی که در متد Update هر مقداری که توی…
به عبارتی فرض رو بر این بگیرید که بکند این پارامتر ها رو توی دیتابیس داره:
Name
Family

حالا بکند بعدا میاد یک پارامتر جدید به نام Age اضافه میکنه یا حتی پارامتر Age توی دیتابیس بوده ولی توی Dto یا Contract نبوده.
وقتی فرانت آپدیت نشده باشه و کاربران با نسخه ی قبلی همچنان دارن Api رو کال میکنند و مقدار Name و Family رو میفرستن. این تابع جلوی آپدیت شدن Age رو توی دیتابیس میگیره و از مقادیر پیشفرض و قبلی شما محافظت میکنه.
این در حالیه که تابع Update کاری نداره شما چی رو پر میکنید یا نمیکنید، شما هرچی بفرستید کل جدول رو بروزرسانی میکنه.
Mimicat - Ai Coração
صبح بخیر، با این کد بزنید تا رستگار شوید!
⭐️⭐️⭐️⭐️⭐️⭐️
@AgrinDM
یه کار عجیب و باحال کردیم.
این فایل های sln رو میبینید که تهش نسخه ی دات نت رو زده؟
اگر هر کدوم از اینارو اجرا کنید سلوشن و کلیه پروژه های داخلش با اون نسخه از دات اجرا میشه بدون اینکه لازم باشه TargetFramework رو توی csproj ها دست بزنید.
یعنی اگر فردا دات نت 9 اومد فقط کافیه اسم فایل رو net9.0 بذارید و اجراش کنید. تمام.
حالا بهتون میگم چطوری اینکار رو بکنید.

@easymicroservice
@easymicroservices
Easy Microservices
یه کار عجیب و باحال کردیم. این فایل های sln رو میبینید که تهش نسخه ی دات نت رو زده؟ اگر هر کدوم از اینارو اجرا کنید سلوشن و کلیه پروژه های داخلش با اون نسخه از دات اجرا میشه بدون اینکه لازم باشه TargetFramework رو توی csproj ها دست بزنید. یعنی اگر فردا دات…
میتونید سورسش رو ایجا ببینید:
https://github.com/EasyMicroservices/Serialization

اما چطوری اینکار رو کردیم؟
توسط شرط هایی که توی csproj ها اضافه کردیم این قابلیت به سیستم اضافه شده:

  <Choose>
<When Condition="$(SolutionFileName.Contains('-net'))">
<PropertyGroup>
<TargetFramework>$(SolutionFileName.Split('-')[1].Replace('.sln',''))</TargetFramework>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;net6.0;net48;net452;net7.0</TargetFrameworks>
</PropertyGroup>
</Otherwise>
</Choose>


اینجا بهش گفتیم اگر توی اسم سلوشن -net وجود داشت بیاد TargetFramework رو از توی اسم فایل استخراج کنه در غیر اینصورت اون TargetFramework های پیشفرض رو در نظر بگیره.

@easymicroservice
@easymicroservices
@csharptips
به میکروسرویس و میکروفرانت Places که بچه‌ی تازه متولد شده هست که تو 5 ساعت پیاده سازی شده سلام کنید 😁.

این کوچولو قراره مدیریت شهرها و کشورها و استان‌ها رو براتون انجام بده.
حالشو ببرید.
رابط کاربری با Blazor زده شده و بکندش هم با Asp Core

@easymicroservices
@easymicroservice
پکیج BinaryGo هنوز هم بعد از اینکه دات نت 8 اومد از grpc و zeroformatter سریعتره.
و سریالایزشن json اش هم از textjson مایکروسافت سریعتر عمل میکنه.
خیلی وقته این پکیج رو به دلیل کمبود وقت توسعه ندادم ولی هنوزم پرچمش بالاست:

https://github.com/Ali-YousefiTelori/BinaryGo

@CsharpTips
@easymicroservices
@easymicroservice
میکروکامپوننت های سمت فرانت رو ما چطوری هندل میکنیم؟
قسمت آبی رنگ api های شما هستند که میکروکامپوننت‌ها به اون متصل میشن.
قسمت های سبز رنگ رو که میبینید اونا کامپوننت هایی هستند که مستقیم با api ها در تماس هستند. و می‌تونن به هر زبانی توی برنامه نویسی نوشته بشن. و کاملا هر کامپوننت از دیگر کامپوننت ها تفکیک شدست.

قسمت نارنجی رنگ کد پروژه ی شماست که از کامپوننت ها استفاده میکنه و در نهایت یک اپلیکیشن تحویل مشتری میده.

#میکروکامپوننت
#میکروفرانت

تلگرام:
@easymicroservice
@easymicroservices
@csharptips
Easy Microservices
به نظر شما یادگیری Docker سخت هست؟ و کار کردن باهاش رو چیز بزرگی می‌بینید؟
خب، می‌خوایم چندتا از دستورات و همچنین کار با داکر رو یاد بگیریم ولی این نکته رو بگم که داکر از گیت هم آسون تره. در واقع اونقدر آسون هست که سریع بتونید یاد بگیرید و باهاش کار کنید.
اگر بخوام یک توضیحی در مورد داکر بدم که چی هست که از پیر و جوون همه متوجه اش بشید اینه:
یک کیس رو وقتی روشن میکنید و سیستم عامل براتون اجرا میشه یک محیط کاملا ایزوله براتون ایجاد میکنه که شامل هارد و رم و سی پی یو هست و شما میتونید توی سیستم عامل اپلیکیشن هاتون رو نصب کنید و اجرا کنید و باهاشون کار کنید.
حالا اگر بهتون بگم که توی سیستم عاملی که دارید باهاش کار میکنید آیا میتونید یک محیط ایزوله درست کنید که از خود محیط سیستم عامل شما جدا باشه؟
مثلا اگر دوتا اپلیکیشن داشته باشید که دیتابیس و دیسک و ابزار های خودشون رو دارن ولی نمی‌خواید کارهایی که این اپلیکیشن ها میکنن هیچ دخل و تصرفی روی کیس اصلی شما داشته باشن، یا حتی هیچ دخل و تصرفی نسبت به هم داشته باشن.

خب اگر یکم با کامپیوتر کار کرده باشید حتما با ماشین های مجازی آشنایی دارید ابزارهایی مثل VMware و HyperV و VBox و ... که این امکان رو به شما میدن که محیط های ایزوله بسازید و توی ماشین های مجازی ای که ساختید سیستم عامل مورد نظرتون رو نصب کنید و توش هرکاری که دوست دارید بکنید. یعنی اگر توی اون سیستم عامل مجازی ویروس هم اجرا کنید فقط همون سیستم عامل میترکه و کاری به سیستم عامل شما نداره به این میگن محیط ایزوله.
یادمه اون موقع که داشتم آنتی ویروس مینوشتم برای اینکه ویروس ها و عملکردشون رو شناسایی کنم اونارو توی محیط ایزوله اجرا میکردم و ببینم این ویروس ها چه بلایی سر ماشین های مجازی میارن 😂.

اگر تعاریف بالا رو متوجه شدید داکر همینه بچه ها، و خیلی هم از مدیریت یک ماشین مجازی کار کردن باهاش آسون تره.
تو مقاله‌ی بعدی بهتون میگم که چطوری یک سورس رو توی داکر به صورت ایزوله اجرا کنید و توی سیستم عامل خودتون ازش استفاده کنید.

#داکر
#docker

@easymicroservices
@easymicroservice
@csharptips
HTML Embed Code:
2025/07/07 11:16:31
Back to Top