مدیریت هوشمند Migrationها در EF Core با Docker و EF Tools
در این روش، شما EF Core Tools را مستقیماً داخل Docker نصب میکنید، که به شما امکان میدهد migrationها را بدون نیاز به نصب ابزارهای اضافی روی سیستم شخصی خود، کاملاً داخل کانتینر مدیریت کنید. این روش برای CI/CD و محیطهای تولیدی عالی است، چون همه چیز ایزوله و مستقل داخل کانتینر انجام میشود.
مراحل نصب EF Core Tools در Docker و اجرای migrationها
۱. تنظیم Dockerfile
در Dockerfile، EF Core Tools را نصب میکنیم تا migrationها بهطور خودکار داخل کانتینر اجرا شوند. هر بار که کانتینر ساخته و اجرا میشود، migrationها اعمال و دیتابیس آماده استفاده میشود.
۲. ساخت و اجرای کانتینر
کافی است دستورات زیر را اجرا کنید تا کانتینر ساخته و اپلیکیشن شما اجرا شود:
مزایای این روش
▫️سادگی و انعطاف در CI/CD:
عملیات migrationها خودکار اجرا میشوند و برای محیطهای CI/CD فوقالعاده مناسب هستند.
▫️استقلال از محیط توسعه:
نیاز به ابزارهای اضافی روی سیستم شخصی نیست؛ همه چیز داخل Docker انجام میشود.
▫️دیتابیس همیشه بهروز:
هر بار که کانتینر اجرا شود، migrationها اعمال میشوند و دیتابیس سینک میماند.
این روش یه راهکار راحت و ایزوله برای مدیریت migrationهاست و کار با Docker را هم سادهتر میکند.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
در این روش، شما EF Core Tools را مستقیماً داخل Docker نصب میکنید، که به شما امکان میدهد migrationها را بدون نیاز به نصب ابزارهای اضافی روی سیستم شخصی خود، کاملاً داخل کانتینر مدیریت کنید. این روش برای CI/CD و محیطهای تولیدی عالی است، چون همه چیز ایزوله و مستقل داخل کانتینر انجام میشود.
مراحل نصب EF Core Tools در Docker و اجرای migrationها
۱. تنظیم Dockerfile
در Dockerfile، EF Core Tools را نصب میکنیم تا migrationها بهطور خودکار داخل کانتینر اجرا شوند. هر بار که کانتینر ساخته و اجرا میشود، migrationها اعمال و دیتابیس آماده استفاده میشود.
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourProject/YourProject.csproj", "YourProject/"]
RUN dotnet restore "YourProject/YourProject.csproj"
COPY . .
RUN dotnet build "YourProject/YourProject.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "YourProject/YourProject.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# نصب EF Core Tools و اجرای migrationها
RUN dotnet tool install --global dotnet-ef
ENV PATH="$PATH:/root/.dotnet/tools"
RUN dotnet ef database update
ENTRYPOINT ["dotnet", "YourProject.dll"]
۲. ساخت و اجرای کانتینر
کافی است دستورات زیر را اجرا کنید تا کانتینر ساخته و اپلیکیشن شما اجرا شود:
docker build -t your-image-name .
docker run -d your-image-name
مزایای این روش
▫️سادگی و انعطاف در CI/CD:
عملیات migrationها خودکار اجرا میشوند و برای محیطهای CI/CD فوقالعاده مناسب هستند.
▫️استقلال از محیط توسعه:
نیاز به ابزارهای اضافی روی سیستم شخصی نیست؛ همه چیز داخل Docker انجام میشود.
▫️دیتابیس همیشه بهروز:
هر بار که کانتینر اجرا شود، migrationها اعمال میشوند و دیتابیس سینک میماند.
این روش یه راهکار راحت و ایزوله برای مدیریت migrationهاست و کار با Docker را هم سادهتر میکند.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
Microsoft News
Introducing DevOps-friendly EF Core Migration Bundles
EF Core's new migration bundles provide build artifacts to deploy schema and data changes to your database as part of your DevOps pipeline.
👍17❤3🔥2
Media is too big
VIEW IN TELEGRAM
کوپایلوتی ساده برای پزشکان
هفته پیش برای کنگره دندانپزشکان یه ورکشاپ هوشمصنوعی داشتم.
دو سه روز قبل کنگره یه کد خیلی ساده نوشتم که بشه تواناییهای هوشمصنوعی و پتانسیلهایی که داره رو به دندونپزشکا نشون بدم و نتیجش شد این.
توضیح اینکه این از یه مدل ساده بدون هیچ بهبودی داره استفاده میکنه و برای پیادهسازیش از مدلهای Azure AI استفاده کردم و کدش رو هم با #csharp نوشتم.
#openai #gpt #dotnet #azure
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
هفته پیش برای کنگره دندانپزشکان یه ورکشاپ هوشمصنوعی داشتم.
دو سه روز قبل کنگره یه کد خیلی ساده نوشتم که بشه تواناییهای هوشمصنوعی و پتانسیلهایی که داره رو به دندونپزشکا نشون بدم و نتیجش شد این.
توضیح اینکه این از یه مدل ساده بدون هیچ بهبودی داره استفاده میکنه و برای پیادهسازیش از مدلهای Azure AI استفاده کردم و کدش رو هم با #csharp نوشتم.
#openai #gpt #dotnet #azure
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
5👏15👍7❤4🔥3
Media is too big
VIEW IN TELEGRAM
معرفی Bit Boilerplate Project Template، بهشت داتنتیها!
در کمتر از ده دقیقه با یکی از کاملترین NET project template. های حال حاضر برای Cross Platform Desktop/Mobile/Web development آشنا بشید و ببینید با Blazor چه اپهای خفنی میشه توسعه داد که هم سبک و سریع باشن و بهینه و با معماری فوقالعاده.
این فریمورک جذاب توسط یه تیم ایرانی درست شده که الان استارتاپشون تو هلنده و خیلی از شرکتهای خارجی و ایرانی از زیرساختشون استفاده میکنن.
https://bitplatform.dev/boilerplate
#dotnet #csharp #blazor #maui
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
در کمتر از ده دقیقه با یکی از کاملترین NET project template. های حال حاضر برای Cross Platform Desktop/Mobile/Web development آشنا بشید و ببینید با Blazor چه اپهای خفنی میشه توسعه داد که هم سبک و سریع باشن و بهینه و با معماری فوقالعاده.
این فریمورک جذاب توسط یه تیم ایرانی درست شده که الان استارتاپشون تو هلنده و خیلی از شرکتهای خارجی و ایرانی از زیرساختشون استفاده میکنن.
https://bitplatform.dev/boilerplate
#dotnet #csharp #blazor #maui
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
2👍17❤11🔥7👏5🤬2🤩1
بررسی و تفاوت چند نوع عددی در سی شارپ: float , int , double , decimal
#csharp_for_beginners
وقتی شما برای زمان طولانی مدت با زبان برنامه نویسی C# کار میکنید متغییرها برای شما به چیزهای عادی و روزمره تبدیل میشوند اما حالا میخواهیم نگاهی دقیقتر به متغییرهای عددی مانند (decimal , double , float , int) داشته باشیم.
▫️چرا int پیش فرض است؟
این به این معنی است که اگر شما یک عدد صحیح را بدون مشخص کردن نوع آن بنویسید، c# به طور خودکار آن را به عنوان int در نظر میگیرد.
در سی شارپ، برای بهبود عملکرد، متغیر عدد به طور پیش فرض روی int قرار می گیرد. int به بهترین وجه با معماری ۳۲ بیتی دات نت هماهنگ است و عملیات سریعتر و کارآمدتر را تضمین می کند. این ممکن است با استاندارد شدن معماری 64 بیتی تغییر کند، اما در حال حاضر، اعداد صحیح ۳۲ بیتی کارآمدترین انتخاب هستند.
مانند مثال روبرو :
▫️ تفاوت نوع اعداد در C#.
استفاده از float و double و decimal در محاسبات، تفاوتهای آنها را نشان می دهد: float دقت بالاتری دارد، double دارای محدوده بزرگتری از دقت است است، و decimal برای اعداد اعشاری با رقم های بسیار بالا که حدود 29 رقم داشته باشند به کار میرود .
مثالی برای درک بهتر تفاوت ها
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
وقتی شما برای زمان طولانی مدت با زبان برنامه نویسی C# کار میکنید متغییرها برای شما به چیزهای عادی و روزمره تبدیل میشوند اما حالا میخواهیم نگاهی دقیقتر به متغییرهای عددی مانند (decimal , double , float , int) داشته باشیم.
▫️چرا int پیش فرض است؟
این به این معنی است که اگر شما یک عدد صحیح را بدون مشخص کردن نوع آن بنویسید، c# به طور خودکار آن را به عنوان int در نظر میگیرد.
در سی شارپ، برای بهبود عملکرد، متغیر عدد به طور پیش فرض روی int قرار می گیرد. int به بهترین وجه با معماری ۳۲ بیتی دات نت هماهنگ است و عملیات سریعتر و کارآمدتر را تضمین می کند. این ممکن است با استاندارد شدن معماری 64 بیتی تغییر کند، اما در حال حاضر، اعداد صحیح ۳۲ بیتی کارآمدترین انتخاب هستند.
مانند مثال روبرو :
var number = 10
▫️ تفاوت نوع اعداد در C#.
استفاده از float و double و decimal در محاسبات، تفاوتهای آنها را نشان می دهد: float دقت بالاتری دارد، double دارای محدوده بزرگتری از دقت است است، و decimal برای اعداد اعشاری با رقم های بسیار بالا که حدود 29 رقم داشته باشند به کار میرود .
مثالی برای درک بهتر تفاوت ها
float floatValue = 1f / 3f;
double doubleValue = 1d / 3d;
decimal decimalValue = 1m / 3m;
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Exception Not Found
C# Decimal vs Double and Other Tips About Number Types
Learn about precision vs accuracy and when to use int, double, and decimal in .NET projects.
1👍13❤2
ظهور #InstructUI برای ساخت #ui با #ai برای #blazor !!!
این ویدئوی ۵ دقیقهای نشان میدهد که چطور میتوانید با چت کردن صفحات مورد نظر خود را بسازید و خروجی لایو آن را ببینید.
محصول جدیدی نیست و قبلا مشابه آن وجود داشته، اما جذابیت این یکی تولید خروجی روی #blazor و #webassembly به جای #react و #javanoscript هست.
دنیای #بلیزر و #وباسمبلی خیلی دنیای جالبی داره میشه و به نظر آینده خیلی خوبی داره در چند سال آینده.
https://www.youtube.com/watch?v=4PiIx4TPgbw
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
این ویدئوی ۵ دقیقهای نشان میدهد که چطور میتوانید با چت کردن صفحات مورد نظر خود را بسازید و خروجی لایو آن را ببینید.
محصول جدیدی نیست و قبلا مشابه آن وجود داشته، اما جذابیت این یکی تولید خروجی روی #blazor و #webassembly به جای #react و #javanoscript هست.
دنیای #بلیزر و #وباسمبلی خیلی دنیای جالبی داره میشه و به نظر آینده خیلی خوبی داره در چند سال آینده.
https://www.youtube.com/watch?v=4PiIx4TPgbw
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
Build an Event Scheduler Front-End in Minutes Using Blazor & Instruct UI
Want to quickly build an Event Scheduler app using Blazor, but tired of spending hours writing UI code? In this video tutorial, you'll learn how Instruct UI can help you easily turn simple text denoscriptions or wireframes into working Blazor UIs—in just minutes.…
2🔥12👍6❤1
حلقهها در سیشارپ
#csharp_for_beginners
در برنامهنویسی، حلقهها ابزارهای قدرتمندی برای اجرای مجموعهای از دستورات بهصورت مکرر هستند. در زبان برنامهنویسی C#، انواع مختلفی از حلقه وجود دارد که به برنامهنویسان امکان میدهد تا وظایف تکراری را با کارایی بالا انجام دهند. در این مقاله، انواع مختلف حلقهها در C# را بررسی کرده و نحوه استفاده از آنها را توضیح خواهیم داد.
حلقه for
حلقه for معمولاً زمانی استفاده میشود که تعداد تکرارها مشخص باشد. این حلقه شامل سه بخش اصلی است:
۱. مقداردهی اولیه
۲. شرط ادامه حلقه
۳. افزایش یا کاهش مقدار متغیر کنترلی
مثال:
حلقه while
حلقه while معمولاً زمانی استفاده میشود که تعداد تکرارها از قبل مشخص نباشد و اجرای حلقه به یک شرط وابسته باشد.
مثال:
این حلقه نیز مانند for مقدار i را از صفر تا ۴ نمایش میدهد، اما شرط در ابتدای حلقه بررسی میشود.
حلقه do-while
حلقه do-while مشابه while است، با این تفاوت که شرط در انتهای حلقه بررسی میشود. بنابراین، بدنهی حلقه حداقل یک بار اجرا خواهد شد.
مثال:
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در برنامهنویسی، حلقهها ابزارهای قدرتمندی برای اجرای مجموعهای از دستورات بهصورت مکرر هستند. در زبان برنامهنویسی C#، انواع مختلفی از حلقه وجود دارد که به برنامهنویسان امکان میدهد تا وظایف تکراری را با کارایی بالا انجام دهند. در این مقاله، انواع مختلف حلقهها در C# را بررسی کرده و نحوه استفاده از آنها را توضیح خواهیم داد.
حلقه for
حلقه for معمولاً زمانی استفاده میشود که تعداد تکرارها مشخص باشد. این حلقه شامل سه بخش اصلی است:
۱. مقداردهی اولیه
۲. شرط ادامه حلقه
۳. افزایش یا کاهش مقدار متغیر کنترلی
مثال:
for (int i = 0; i < 5; i++)
{
; ("مقدار i: " + i)Console.WriteLine
}
حلقه while
حلقه while معمولاً زمانی استفاده میشود که تعداد تکرارها از قبل مشخص نباشد و اجرای حلقه به یک شرط وابسته باشد.
مثال:
int i = 0;
while (i < 5)
{
;("مقدار i: " + i)Console.WriteLine
i++;
}
این حلقه نیز مانند for مقدار i را از صفر تا ۴ نمایش میدهد، اما شرط در ابتدای حلقه بررسی میشود.
حلقه do-while
حلقه do-while مشابه while است، با این تفاوت که شرط در انتهای حلقه بررسی میشود. بنابراین، بدنهی حلقه حداقل یک بار اجرا خواهد شد.
مثال:
int i = 0;
do
{
;("مقدار i: " + i)Console.WriteLine
i++;
} while (i < 5);
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Iteration statements -for, foreach, do, and while - C# reference
C# iteration statements (for, foreach, do, and while) repeatedly execute a block of code. You use those statements to create loops or iterate through a collection.
👍7❤1
۱۰ برابر شدن سرعت TypeScript با پورت کامپایلر به GO
در این ویدئو Andres Hejlsberg (خالق تایپاسکریپت و سیشارپ) توضیح میدهد که چگونه با پورت کردن کدهای کامپایلر TypeScript به GO، سرعت کامپایل را 10x بهتر کردهاند!
او همچنین توضیح میدهد که چرا زیرساخت JavaScript برای این کار مناسب نیست. در حقیقت این زبان بیشتر برای کارهای UI طراحی شده بوده و زیرساختهای لازم برای کارهای performance-intensive مانند این کار را ندارد.
برای من خیلی جالب بود خالق سیشارپ، زبان GO را برای این کار انتخاب کرده، پس مستندات مربوط به این تصمیم را خواندم.
https://github.com/microsoft/typenoscript-go/discussions/411
اولین نکته جالب این بود که چقدر بدون تعصب و با ذهن باز زبانهای مختلف رو بررسی کردن.
با توجه به اینکه هر دو زبان C#, GO از لحاظ پرفورمنسی بسیار خوب هستند، یکی از مهمترین دلایل انتخاب GO تشابه بسیار بالای سینتکس آن با TypeScript بوده است.
کامپایلر قبلی تایپاسکریپت، با خود تایپاسکریپت نوشته شده و تیم نمیخواستند که کل آن را بازنویسی کنند.
در حقیقت هدف rewrite کردن نبوده، بلکه port کردن بوده.
آنها دنبال پورت کردن آن به یک زبان با پرفورمنس بالا بودند که تشابه سینتکسی بالایی داشته باشد تا عملیات پورت بتواند راحتتر انجام شود.
از بین زبانهای C#, GO و Rust، زبان گو تشابه سینتکسی بیشتری با تایپاسکریپت داشته و در نهایت انتخاب شده.
به نظرم نحوه انتخاب زبان برای این کار توسط خالق سیشارپ و تایپاسکریپ، درسهای تکنیکال و بیزسنی زیادی برای یاد گرفتن داره. نظر شما چیه؟
https://www.youtube.com/watch?v=pNlq-EVld70
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
در این ویدئو Andres Hejlsberg (خالق تایپاسکریپت و سیشارپ) توضیح میدهد که چگونه با پورت کردن کدهای کامپایلر TypeScript به GO، سرعت کامپایل را 10x بهتر کردهاند!
او همچنین توضیح میدهد که چرا زیرساخت JavaScript برای این کار مناسب نیست. در حقیقت این زبان بیشتر برای کارهای UI طراحی شده بوده و زیرساختهای لازم برای کارهای performance-intensive مانند این کار را ندارد.
برای من خیلی جالب بود خالق سیشارپ، زبان GO را برای این کار انتخاب کرده، پس مستندات مربوط به این تصمیم را خواندم.
https://github.com/microsoft/typenoscript-go/discussions/411
اولین نکته جالب این بود که چقدر بدون تعصب و با ذهن باز زبانهای مختلف رو بررسی کردن.
با توجه به اینکه هر دو زبان C#, GO از لحاظ پرفورمنسی بسیار خوب هستند، یکی از مهمترین دلایل انتخاب GO تشابه بسیار بالای سینتکس آن با TypeScript بوده است.
کامپایلر قبلی تایپاسکریپت، با خود تایپاسکریپت نوشته شده و تیم نمیخواستند که کل آن را بازنویسی کنند.
در حقیقت هدف rewrite کردن نبوده، بلکه port کردن بوده.
آنها دنبال پورت کردن آن به یک زبان با پرفورمنس بالا بودند که تشابه سینتکسی بالایی داشته باشد تا عملیات پورت بتواند راحتتر انجام شود.
از بین زبانهای C#, GO و Rust، زبان گو تشابه سینتکسی بیشتری با تایپاسکریپت داشته و در نهایت انتخاب شده.
به نظرم نحوه انتخاب زبان برای این کار توسط خالق سیشارپ و تایپاسکریپ، درسهای تکنیکال و بیزسنی زیادی برای یاد گرفتن داره. نظر شما چیه؟
https://www.youtube.com/watch?v=pNlq-EVld70
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
GitHub
Why Go? · microsoft typenoscript-go · Discussion #411
Language choice is always a hot topic! We extensively evaluated many language options, both recently and in prior investigations. We also considered hybrid approaches where certain components could...
1🔥20👍14❤4
آشنایی با Outbox Pattern و اهمیت آن در سیستمهای توزیعشده
آیا تاکنون در توسعهی یک سیستم توزیعشده با این دغدغه مواجه شدهاید که هنگام ثبت تغییرات در پایگاه داده و همزمان ارسال پیام (رویداد) به یک سرویس دیگر (مانند RabbitMQ یا Kafka)، ممکن است یکی از این مراحل با موفقیت انجام شود و دیگری با شکست روبهرو گردد؟ در چنین شرایطی، بخشی از دادهها بهروز میشود اما سرویسهای مصرفکننده از این تغییرات بیخبر میمانند و هماهنگی میان بخشهای مختلف سیستم از بین میرود.
مشکل اصلی کجاست؟
بهطور معمول، اگر در حین بهروزرسانی یک موجودیت در پایگاه داده بخواهیم یک رویداد نیز به سیستم دیگری ارسال کنیم و مراحل دیتابیس و ارسال پیام در یک تراکنش مجزا یا بهصورت ناهمزمان انجام شوند، احتمال از دست رفتن یا عدم ارسال پیام وجود دارد. این امر ممکن است به ناسازگاری در دادهها و عملکرد سرویسهای وابسته منجر شود.
راهحل چیست؟
در اینجاست که الگوی Outbox وارد عمل میشود. این الگو پیشبینی میکند که ابتدا همهی رویدادهایی که قرار است برای سیستمهای دیگر ارسال شوند در جدولی اختصاصی (Outbox Table) در همان پایگاه دادهی اصلی ذخیره شوند. این کار همزمان با تراکنش بهروزرسانی سایر دادهها صورت میگیرد، بهطوریکه اگر عملیات اصلی موفق باشد، اطلاعات رویداد نیز قطعاً ثبت میشود.
سپس چه میشود؟
یک فرایند مجزا (Outbox Process) بهطور مستمر این جدول را بررسی میکند و رویدادهای ثبتشده را به پیامرسان (Message Broker) ارسال میکند. در صورت موفقیت در ارسال، رکورد مربوطه از جدول Outbox حذف میشود و بدین ترتیب از ارسال مجدد ناخواسته جلوگیری میگردد. اگر هم پیامرسان در لحظه غیرفعال باشد یا خطایی رخ دهد، رکورد رویداد کماکان در پایگاه داده باقی میماند تا در تلاش بعدی مجدداً ارسال شود.
مزایای Outbox Pattern
۱. جلوگیری از ناسازگاری دادهها: با انجام ثبت رویداد و تغییرات داده در یک تراکنش واحد، احتمال بروز تناقض در دادهها کاهش مییابد.
۲. اطمینان از عدم از دست رفتن رویدادها: حتی اگر زیرساخت ارتباطی یا پیامرسان موقتاً از دسترس خارج شود، پیام در Outbox محفوظ میماند و پس از بازگشت سرویس، ارسال خواهد شد.
۳. مقیاسپذیری بالا: افزودن سرویسهای جدید یا گسترش زیرساخت پیامرسانی تحت تأثیر این الگو بهراحتی امکانپذیر است، چرا که شیوهی ثبت و ارسال رویدادها مشخص و یکپارچه است.
در واقع Outbox Pattern راهکاری قدرتمند و مطمئن برای ساخت سیستمهای توزیعشده و مبتنی بر رویداد است و کمک میکند دغدغهی شکست ارسال پیام و ناسازگاری دادهها برطرف شود.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
___________
آیا تاکنون در توسعهی یک سیستم توزیعشده با این دغدغه مواجه شدهاید که هنگام ثبت تغییرات در پایگاه داده و همزمان ارسال پیام (رویداد) به یک سرویس دیگر (مانند RabbitMQ یا Kafka)، ممکن است یکی از این مراحل با موفقیت انجام شود و دیگری با شکست روبهرو گردد؟ در چنین شرایطی، بخشی از دادهها بهروز میشود اما سرویسهای مصرفکننده از این تغییرات بیخبر میمانند و هماهنگی میان بخشهای مختلف سیستم از بین میرود.
مشکل اصلی کجاست؟
بهطور معمول، اگر در حین بهروزرسانی یک موجودیت در پایگاه داده بخواهیم یک رویداد نیز به سیستم دیگری ارسال کنیم و مراحل دیتابیس و ارسال پیام در یک تراکنش مجزا یا بهصورت ناهمزمان انجام شوند، احتمال از دست رفتن یا عدم ارسال پیام وجود دارد. این امر ممکن است به ناسازگاری در دادهها و عملکرد سرویسهای وابسته منجر شود.
راهحل چیست؟
در اینجاست که الگوی Outbox وارد عمل میشود. این الگو پیشبینی میکند که ابتدا همهی رویدادهایی که قرار است برای سیستمهای دیگر ارسال شوند در جدولی اختصاصی (Outbox Table) در همان پایگاه دادهی اصلی ذخیره شوند. این کار همزمان با تراکنش بهروزرسانی سایر دادهها صورت میگیرد، بهطوریکه اگر عملیات اصلی موفق باشد، اطلاعات رویداد نیز قطعاً ثبت میشود.
سپس چه میشود؟
یک فرایند مجزا (Outbox Process) بهطور مستمر این جدول را بررسی میکند و رویدادهای ثبتشده را به پیامرسان (Message Broker) ارسال میکند. در صورت موفقیت در ارسال، رکورد مربوطه از جدول Outbox حذف میشود و بدین ترتیب از ارسال مجدد ناخواسته جلوگیری میگردد. اگر هم پیامرسان در لحظه غیرفعال باشد یا خطایی رخ دهد، رکورد رویداد کماکان در پایگاه داده باقی میماند تا در تلاش بعدی مجدداً ارسال شود.
مزایای Outbox Pattern
۱. جلوگیری از ناسازگاری دادهها: با انجام ثبت رویداد و تغییرات داده در یک تراکنش واحد، احتمال بروز تناقض در دادهها کاهش مییابد.
۲. اطمینان از عدم از دست رفتن رویدادها: حتی اگر زیرساخت ارتباطی یا پیامرسان موقتاً از دسترس خارج شود، پیام در Outbox محفوظ میماند و پس از بازگشت سرویس، ارسال خواهد شد.
۳. مقیاسپذیری بالا: افزودن سرویسهای جدید یا گسترش زیرساخت پیامرسانی تحت تأثیر این الگو بهراحتی امکانپذیر است، چرا که شیوهی ثبت و ارسال رویدادها مشخص و یکپارچه است.
در واقع Outbox Pattern راهکاری قدرتمند و مطمئن برای ساخت سیستمهای توزیعشده و مبتنی بر رویداد است و کمک میکند دغدغهی شکست ارسال پیام و ناسازگاری دادهها برطرف شود.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
___________
Baeldung on Computer Science
Outbox Pattern in Microservices | Baeldung on Computer Science
Learn how to implement the Outbox Pattern for microservices.
1👍16❤4🔥2
درک انواع دادهها در سیشارپ
#csharp_for_beginners
در دنیای C#، درک تفاوتهای بین انواع دادهها برای برنامهنویسی مؤثر بسیار مهم است. این مقاله به بررسی تفاوتهای بین انواع دادههای decimal، double و float میپردازد و بر دقت، صحت و تأثیرات عملکردی آنها تمرکز میکند.
دقت (Precision): به نزدیکی اندازهگیریها اشاره دارد. به عنوان مثال، اگر یک مقدار را چندین بار اندازهگیری کنیم و نتیجه یکسانی بگیریم، نشاندهنده دقت بالا است.
صحت (Accuracy): نشاندهنده نزدیکی یک اندازهگیری به یک استاندارد شناخته شده است. یک اندازهگیری که از مقدار واقعی دور است، نادرست تلقی میشود.
دقت حسابی (Arithmetic Precision): به تعداد ارقام استفاده شده برای نمایش یک عدد اشاره دارد. ارقام بیشتر به معنای دقت بالاتر است.
تایپ decimal
دقت: دقت بالا (28-29 رقم معنادار).
موارد استفاده: ایدهآل برای محاسبات مالی که در آن دقت بسیار مهم است.
عملکرد: به دلیل نمایندگی پایه 10، کندتر از double و float است.
تایپ double
دقت: دقت متوسط (15-16 رقم معنادار).
موارد استفاده: مناسب برای محاسبات علمی که در آن عملکرد مهمتر از دقت است.
عملکرد: به دلیل نمایندگی پایه 2، سریعتر از decimal است.
تایپ float
دقت: دقت پایین (7 رقم معنادار).
موارد استفاده: در برنامههایی که صرفهجویی در حافظه مهمتر از دقت است، مانند گرافیک، استفاده میشود.
عملکرد: مشابه double است اما با دقت کمتر.
مقایسه عملکرد
هنگام مقایسه عملکرد این انواع داده، مشخص میشود که:
تایپ Double سریعترین است و برای برنامههایی که به محاسبات سریع نیاز دارند، مناسب است.
تایپ Decimal کندترین است اما بالاترین دقت را ارائه میدهد و برای برنامههای مالی ایدهآل است.
تایپ Float تعادلی بین سرعت و استفاده از حافظه ارائه میدهد اما دقت را فدای آن میکند.
🔗 ویدئو را از اینجا میتوانید ببیند.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در دنیای C#، درک تفاوتهای بین انواع دادهها برای برنامهنویسی مؤثر بسیار مهم است. این مقاله به بررسی تفاوتهای بین انواع دادههای decimal، double و float میپردازد و بر دقت، صحت و تأثیرات عملکردی آنها تمرکز میکند.
دقت (Precision): به نزدیکی اندازهگیریها اشاره دارد. به عنوان مثال، اگر یک مقدار را چندین بار اندازهگیری کنیم و نتیجه یکسانی بگیریم، نشاندهنده دقت بالا است.
صحت (Accuracy): نشاندهنده نزدیکی یک اندازهگیری به یک استاندارد شناخته شده است. یک اندازهگیری که از مقدار واقعی دور است، نادرست تلقی میشود.
دقت حسابی (Arithmetic Precision): به تعداد ارقام استفاده شده برای نمایش یک عدد اشاره دارد. ارقام بیشتر به معنای دقت بالاتر است.
تایپ decimal
دقت: دقت بالا (28-29 رقم معنادار).
موارد استفاده: ایدهآل برای محاسبات مالی که در آن دقت بسیار مهم است.
عملکرد: به دلیل نمایندگی پایه 10، کندتر از double و float است.
تایپ double
دقت: دقت متوسط (15-16 رقم معنادار).
موارد استفاده: مناسب برای محاسبات علمی که در آن عملکرد مهمتر از دقت است.
عملکرد: به دلیل نمایندگی پایه 2، سریعتر از decimal است.
تایپ float
دقت: دقت پایین (7 رقم معنادار).
موارد استفاده: در برنامههایی که صرفهجویی در حافظه مهمتر از دقت است، مانند گرافیک، استفاده میشود.
عملکرد: مشابه double است اما با دقت کمتر.
مقایسه عملکرد
هنگام مقایسه عملکرد این انواع داده، مشخص میشود که:
تایپ Double سریعترین است و برای برنامههایی که به محاسبات سریع نیاز دارند، مناسب است.
تایپ Decimal کندترین است اما بالاترین دقت را ارائه میدهد و برای برنامههای مالی ایدهآل است.
تایپ Float تعادلی بین سرعت و استفاده از حافظه ارائه میدهد اما دقت را فدای آن میکند.
🔗 ویدئو را از اینجا میتوانید ببیند.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
Difference between double, float and decimal data types | C#
In this video, we analyze the difference between double, float and decimal data types in C#.
1👍20❤2👏1
ساخت یک MCP Server ساده با سیشارپ
اگه برنامهنویس #داتنت هستین، تو این پست توضیح داده که چطور با #سیشارپ میتونین یه MCP Server بالا بیارین و توی Cursor تستش کنین.
اگر نمیدونین MCP چیه، یه چورایی همون معادل REST API دنیای وب، در هوش مصنوعیه. یعنی سیستمهای مختلف امکانات هوشمصنوعی خودشون رو از این طریق در اختیار بقیه سیستمهای هوشمصنوعی قرار میدن.
مفهوم MCP از اونجایی خیلی مهمه که میتونه همون نقشی که ظهور API ها در دنیای وب باعث گسترش یک عالمه اینتگریشن شد، همون نقش رو میتونن MCP ها هم بازی کنن و باعث رشد خیلی زیاد محصولات هوشمصنوعی باشیم.
تو این پست قدم به قدم اول یه پروژه داتنتی ساده درست کرده و بعد کدهای مربوط به MCP رو نوشته و در آخر هم نشون داده که چطور میتونین این MCP رو با Cursor تست کنین.
https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p
https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
اگه برنامهنویس #داتنت هستین، تو این پست توضیح داده که چطور با #سیشارپ میتونین یه MCP Server بالا بیارین و توی Cursor تستش کنین.
اگر نمیدونین MCP چیه، یه چورایی همون معادل REST API دنیای وب، در هوش مصنوعیه. یعنی سیستمهای مختلف امکانات هوشمصنوعی خودشون رو از این طریق در اختیار بقیه سیستمهای هوشمصنوعی قرار میدن.
مفهوم MCP از اونجایی خیلی مهمه که میتونه همون نقشی که ظهور API ها در دنیای وب باعث گسترش یک عالمه اینتگریشن شد، همون نقش رو میتونن MCP ها هم بازی کنن و باعث رشد خیلی زیاد محصولات هوشمصنوعی باشیم.
تو این پست قدم به قدم اول یه پروژه داتنتی ساده درست کرده و بعد کدهای مربوط به MCP رو نوشته و در آخر هم نشون داده که چطور میتونین این MCP رو با Cursor تست کنین.
https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p
https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
Create an MCP Server with .NET and C#
In this post, I'll show you how to create a simple MCP Server and test it in Cursor. For this...
5👍19❤10🔥4
انواع عددی صحیح (Integral Numeric Types) در سی شارپ
#csharp_for_beginners
در زبان برنامهنویسی C#، انواع عددی صحیح (Integral Numeric Types) برای نمایش اعداد صحیح به کار میروند. این انواع دادهای بهعنوان نوعدادههای مقداری (Value Types) شناخته میشوند و از عملیاتهای حسابی، منطقی بیتی، مقایسهای و تساوی پشتیبانی میکنند
▫️در C#، انواع دادهای عددی صحیح شامل موارد زیر هستند:
نوع sbyte: از مقدار ۱۲۸- تا ۱۲۷ را در ۸ بیت ذخیره میکند و معادل
نوع byte: از مقدار ۰ تا ۲۵۵ را در ۸ بیت ذخیره میکند و معادل
نوع short: از مقدار ۳۲۷۶۸- تا ۳۲۷۶۷ را در ۱۶ بیت ذخیره میکند و معادل
نوع ushort: از مقدار ۰ تا ۶۵۶۳۵ را در ۱۶ بیت ذخیره میکند و معادل
نوع int: از مقدار -2,147,483,648 تا 2,147,483,647 را در 32 بیت ذخیره میکند و معادل
نوع uint: از مقدار ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵ را در ۳۲ بیت ذخیره میکند و معادل
نوع long: از مقدار -9,223,372,036,854,775,808 تا 9,223,372,036,854,775,807 را در 64 بیت ذخیره میکند و معادل
نوع ulong: از مقدار ۰ تا ۱۸,۴۴۶,۷۴۴,۰۷۳,۷۰۹,۵۵۱,۶۱۵ را در ۶۴ بیت ذخیره میکند و معادل
نوع nint: اندازهای وابسته به پلتفرم دارد (در سیستمهای ۳۲ بیتی، ۳۲ بیت و در سیستمهای ۶۴ بیتی، ۶۴ بیت است) و معادل
نوع nuint: مانند
این انواع دادهای برای ذخیره اعداد صحیح استفاده میشوند و بسته به نیاز حافظه و محدوده مقادیر مورد نظر انتخاب میشوند
مقادیر پیشفرض: مقدار پیشفرض برای تمامی انواع عددی صحیح، صفر (
حداقل و حداکثر مقادیر: هر نوع دادهای دارای ویژگیهای
انواع با اندازه وابسته به پلتفرم: انواع
انواع بدون مرز: برای نمایش اعداد صحیح با اندازه نامحدود، میتوان از ساختار
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در زبان برنامهنویسی C#، انواع عددی صحیح (Integral Numeric Types) برای نمایش اعداد صحیح به کار میروند. این انواع دادهای بهعنوان نوعدادههای مقداری (Value Types) شناخته میشوند و از عملیاتهای حسابی، منطقی بیتی، مقایسهای و تساوی پشتیبانی میکنند
▫️در C#، انواع دادهای عددی صحیح شامل موارد زیر هستند:
نوع sbyte: از مقدار ۱۲۸- تا ۱۲۷ را در ۸ بیت ذخیره میکند و معادل
System.SByte در .NET است.نوع byte: از مقدار ۰ تا ۲۵۵ را در ۸ بیت ذخیره میکند و معادل
System.Byte است.نوع short: از مقدار ۳۲۷۶۸- تا ۳۲۷۶۷ را در ۱۶ بیت ذخیره میکند و معادل
System.Int16 است.نوع ushort: از مقدار ۰ تا ۶۵۶۳۵ را در ۱۶ بیت ذخیره میکند و معادل
System.UInt16 است.نوع int: از مقدار -2,147,483,648 تا 2,147,483,647 را در 32 بیت ذخیره میکند و معادل
System.Int32 است.نوع uint: از مقدار ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵ را در ۳۲ بیت ذخیره میکند و معادل
System.UInt32 است.نوع long: از مقدار -9,223,372,036,854,775,808 تا 9,223,372,036,854,775,807 را در 64 بیت ذخیره میکند و معادل
System.Int64 است.نوع ulong: از مقدار ۰ تا ۱۸,۴۴۶,۷۴۴,۰۷۳,۷۰۹,۵۵۱,۶۱۵ را در ۶۴ بیت ذخیره میکند و معادل
System.UInt64 است.نوع nint: اندازهای وابسته به پلتفرم دارد (در سیستمهای ۳۲ بیتی، ۳۲ بیت و در سیستمهای ۶۴ بیتی، ۶۴ بیت است) و معادل
System.IntPtr میباشد.نوع nuint: مانند
nint، اندازهای وابسته به پلتفرم دارد و معادل System.UIntPtr است.این انواع دادهای برای ذخیره اعداد صحیح استفاده میشوند و بسته به نیاز حافظه و محدوده مقادیر مورد نظر انتخاب میشوند
مقادیر پیشفرض: مقدار پیشفرض برای تمامی انواع عددی صحیح، صفر (
0) است.حداقل و حداکثر مقادیر: هر نوع دادهای دارای ویژگیهای
MinValue و MaxValue است که به ترتیب حداقل و حداکثر مقدار قابلپذیرش را نشان میدهند.انواع با اندازه وابسته به پلتفرم: انواع
nint و nuint به اندازه پلتفرم وابسته هستند؛ یعنی در فرآیندهای ۳۲ بیتی بهصورت ۳۲ بیتی و در فرآیندهای ۶۴ بیتی بهصورت ۶۴ بیتی عمل میکنند.انواع بدون مرز: برای نمایش اعداد صحیح با اندازه نامحدود، میتوان از ساختار
System.Numerics.BigInteger استفاده کرد.🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Integral numeric types
Learn the range, storage size, and uses for each of the integral numeric types.
1👍15❤3
ساخت برنامههای Mixed Reality و 3D با Unity
ساختن برنامههایی که با دنیای واقعی مرتبط هستند یکی از قسمتهای هیجانانگیز برنامهنویسی است.
یکی از معروفترین ابزارها برای ساخت چین برنامههایی Unity هست.
کاربرد اصلی Unity ساخت بازی است. بازیهایی که هم در کامپیوتر، و هم در محیطهایی مثل VR/AR Headsets قابل اجرا هستند.
با اینکه کاربرد اصلی Unity ساخت بازی است، ولی از آن برای ساخت برنامههای Enterprise ی که نیاز به محیطهای 3D و Mixed Reality هم استفاده میشود. مثلا نمایش وضعیت دستگاههای یک کارخانه، یا وضعیت هواپیماها در یک فرودگاه.
این ویدئو، در مورد ساخت چین برنامههایی صحبت میکند و توضیح میدهد که چگونه میتوان با Unity برای این نوع مسائل برنامهبنویسی کرد.
آخرای این ویدئو کوه کلیمانجارو رو توی اتاق خونش رندر میکنه!
و بعدش نشون میده که چطور مغز انسان رو تو اتاق و جلوی چشمش لود میکنه و این نوع برنامهها چه کمکهای بزرگی به علم پزشکی میکنن.
🔗 ویدئو را میتوانید اینجا ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
ساختن برنامههایی که با دنیای واقعی مرتبط هستند یکی از قسمتهای هیجانانگیز برنامهنویسی است.
یکی از معروفترین ابزارها برای ساخت چین برنامههایی Unity هست.
کاربرد اصلی Unity ساخت بازی است. بازیهایی که هم در کامپیوتر، و هم در محیطهایی مثل VR/AR Headsets قابل اجرا هستند.
با اینکه کاربرد اصلی Unity ساخت بازی است، ولی از آن برای ساخت برنامههای Enterprise ی که نیاز به محیطهای 3D و Mixed Reality هم استفاده میشود. مثلا نمایش وضعیت دستگاههای یک کارخانه، یا وضعیت هواپیماها در یک فرودگاه.
این ویدئو، در مورد ساخت چین برنامههایی صحبت میکند و توضیح میدهد که چگونه میتوان با Unity برای این نوع مسائل برنامهبنویسی کرد.
آخرای این ویدئو کوه کلیمانجارو رو توی اتاق خونش رندر میکنه!
و بعدش نشون میده که چطور مغز انسان رو تو اتاق و جلوی چشمش لود میکنه و این نوع برنامهها چه کمکهای بزرگی به علم پزشکی میکنن.
🔗 ویدئو را میتوانید اینجا ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
On .NET Live - .NET in 3D
One of our favorite things about .NET is how it runs pretty much everywhere. In this week's episode, community MVP Joost van Schaik joins us to talk about making 3D apps for various headsets, including Quest, Magic Leap 2, HoloLens, and more!
⌚ Chapters:…
⌚ Chapters:…
1👍7❤2🔥1
میدونستین راز ساختن محصولات #ai روی #dotnet در مفاهیم IChatClient و Microsoft.Extentions.AI است؟
فردا تو این لایو لیندکین قراره در مورد اینا صحبت کنم.
میبینمتون.
#cs_internship
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
فردا تو این لایو لیندکین قراره در مورد اینا صحبت کنم.
میبینمتون.
#cs_internship
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
LinkedIn
LinkedIn Login, Sign in | LinkedIn
Login to LinkedIn to keep in touch with people you know, share ideas, and build your career.
1❤12👍5🔥2😁1
متدها در سیشارپ
#csharp_for_beginners
متدها در زبان برنامهنویسی C# بلوکهایی از کد هستند که مجموعهای از دستورات را در بر میگیرند. اجرای این دستورات با فراخوانی متد و ارائه آرگومانهای مورد نیاز صورت میگیرد. در C#، هر دستور اجرایی در زمینه یک متد انجام میشود. به عنوان مثال، متد Main نقطه ورود هر برنامه C# است که توسط محیط اجرای مشترک زبان (CLR) هنگام شروع برنامه فراخوانی میشود.
امضای متدها
متدها در یک کلاس، ساختار یا اینترفیس با مشخص کردن سطح دسترسی (مانند public یا private)، اصلاحکنندههای اختیاری (مانند abstract یا sealed)، نوع بازگشتی، نام متد و هر پارامتر مورد نیاز تعریف میشوند. این اجزا با هم امضای متد را تشکیل میدهند. توجه داشته باشید که نوع بازگشتی بخشی از امضای متد برای اهداف سربارگذاری متد محسوب نمیشود، اما در تعیین سازگاری بین یک نماینده (delegate) و متدی که به
آن اشاره میکند، مهم است.
فراخوانی متدها
پارامترها و آرگومانها
تعریف متد مشخص میکند که چه پارامترهایی با چه نامها و نوعهایی مورد نیاز است. هنگام فراخوانی متد، مقادیر مشخصی به نام آرگومان برای هر پارامتر ارائه میشود. این آرگومانها باید با نوع پارامتر سازگار باشند، اما نام آرگومان در کد فراخوانی لزوماً نباید با نام پارامتر در تعریف متد یکسان باشد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
متدها در زبان برنامهنویسی C# بلوکهایی از کد هستند که مجموعهای از دستورات را در بر میگیرند. اجرای این دستورات با فراخوانی متد و ارائه آرگومانهای مورد نیاز صورت میگیرد. در C#، هر دستور اجرایی در زمینه یک متد انجام میشود. به عنوان مثال، متد Main نقطه ورود هر برنامه C# است که توسط محیط اجرای مشترک زبان (CLR) هنگام شروع برنامه فراخوانی میشود.
امضای متدها
متدها در یک کلاس، ساختار یا اینترفیس با مشخص کردن سطح دسترسی (مانند public یا private)، اصلاحکنندههای اختیاری (مانند abstract یا sealed)، نوع بازگشتی، نام متد و هر پارامتر مورد نیاز تعریف میشوند. این اجزا با هم امضای متد را تشکیل میدهند. توجه داشته باشید که نوع بازگشتی بخشی از امضای متد برای اهداف سربارگذاری متد محسوب نمیشود، اما در تعیین سازگاری بین یک نماینده (delegate) و متدی که به
آن اشاره میکند، مهم است.
فراخوانی متدها
برای فراخوانی یک متد، پس از نام شیء، یک نقطه، نام متد و پرانتزها را اضافه میکنیم. آرگومانها در داخل پرانتزها قرار میگیرند و با کاما از هم جدا میشوند. به عنوان مثال، اگر کلاسی به نام Motorcycle با متدهایی مانند StartEngine، AddGas و Drive داشته باشیم، میتوانیم آنها را به صورت زیر فراخوانی کنیمTestMotorcycle moto = new TestMotorcycle();
moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);
double speed = moto.GetTopSpeed();
Console.WriteLine("My top speed is {0}", speed );
پارامترها و آرگومانها
تعریف متد مشخص میکند که چه پارامترهایی با چه نامها و نوعهایی مورد نیاز است. هنگام فراخوانی متد، مقادیر مشخصی به نام آرگومان برای هر پارامتر ارائه میشود. این آرگومانها باید با نوع پارامتر سازگار باشند، اما نام آرگومان در کد فراخوانی لزوماً نباید با نام پارامتر در تعریف متد یکسان باشد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
Methods - C#
A method in C# is a code block that contains a series of statements. A program runs the statements by calling the method and specifying arguments.
👍9👏1
نگاهی کمی فلسفیتر به MCP
مفهوم MCP بحث داغ این روزهای دنیای هوش مصنوعی است.
با نگاهی خاص میتوان گفت که MCP میتواند همان تاثیری را در دنیای هوشمصنوعی بگذارد که REST بر دنیای وب گذاشت.
در این مقاله جالب که به مقایسه این دو تکنولوژی و کارکردهایشان پرداخته، مفهوم Discovery را هم بررسی کرده که در حال حاضر بخشی از استاندارد REST نیست ولی MCP این فیچر را دارا است.
به نظرم من نقطه نظر نویسنده این مقاله در این مورد خیلی جالب است. قبلا هم در دنیای وب تکنولوژیها و پروتکلهایی وجود داشت که Discovery هم داشتند، ولی از آنجایی که معمولا هیچ برنامهنویسی از آن ویژگیها استفاده نمیکرد زیاد مورد استقبال قرار نگرفت.
ولی در دنیای هوشمصنوعی، ایجنتهای هوشمصنوعی استفاده بسیار زیادی از این ویژگی میکنند.
🔗 پیشنهاد میکنم حتما این مقاله جذاب رو بخونین.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
مفهوم MCP بحث داغ این روزهای دنیای هوش مصنوعی است.
با نگاهی خاص میتوان گفت که MCP میتواند همان تاثیری را در دنیای هوشمصنوعی بگذارد که REST بر دنیای وب گذاشت.
در این مقاله جالب که به مقایسه این دو تکنولوژی و کارکردهایشان پرداخته، مفهوم Discovery را هم بررسی کرده که در حال حاضر بخشی از استاندارد REST نیست ولی MCP این فیچر را دارا است.
به نظرم من نقطه نظر نویسنده این مقاله در این مورد خیلی جالب است. قبلا هم در دنیای وب تکنولوژیها و پروتکلهایی وجود داشت که Discovery هم داشتند، ولی از آنجایی که معمولا هیچ برنامهنویسی از آن ویژگیها استفاده نمیکرد زیاد مورد استقبال قرار نگرفت.
ولی در دنیای هوشمصنوعی، ایجنتهای هوشمصنوعی استفاده بسیار زیادی از این ویژگی میکنند.
🔗 پیشنهاد میکنم حتما این مقاله جذاب رو بخونین.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
twitchard.github.io
MCP: REST reborn?
How the web departed from its original vision, and how MCP might bring it back
5👍18❤1🔥1
مقدمهای بر کلاسها در سی شارپ
#csharp_for_beginners
در زبان برنامهنویسی C#، کلاسها (Classes) به عنوان یکی از اصلیترین ساختارهای برنامهنویسی شیءگرا عمل میکنند. کلاسها در C# قالبی برای ایجاد اشیاء (Objects) هستند و شامل دادهها (فیلدها و خصوصیات) و رفتارها (متدها) میشوند.
در این مقاله، مفهوم کلاس در C#، نحوه تعریف آن، انواع اعضای کلاس، اصول شیءگرایی مرتبط و مفاهیم پیشرفته بررسی خواهند شد.
۱. تعریف کلاس در C#
در C#، کلاس با استفاده از کلمه کلیدی class تعریف میشود. یک کلاس میتواند شامل متغیرها، خصوصیات، متدها و رویدادها باشد. در ادامه یک نمونه ساده از کلاس آورده شده است:
۲. ایجاد شیء از کلاس
برای استفاده از کلاس، باید یک نمونه (Object) از آن ایجاد کنیم:
در این کد:
• یک شیء myCar از کلاس Car ساخته شده است.
• مقادیر فیلدهای آن مقداردهی شدهاند.
• متد DisplayInfo برای نمایش اطلاعات خودرو فراخوانی شده است.
۳. فیلدها، خصوصیات و متدها
فیلدها (Fields)
فیلدها متغیرهایی هستند که دادههای کلاس را نگهداری میکنند. در مثال قبل، Brand، Model و Year فیلد بودند.
خصوصیات (Properties)
خصوصیات راهی استاندارد برای دسترسی ایمن به دادههای کلاس هستند. به جای استفاده مستقیم از فیلدها، میتوان از property استفاده کرد:
#csharp_for_beginners
در زبان برنامهنویسی C#، کلاسها (Classes) به عنوان یکی از اصلیترین ساختارهای برنامهنویسی شیءگرا عمل میکنند. کلاسها در C# قالبی برای ایجاد اشیاء (Objects) هستند و شامل دادهها (فیلدها و خصوصیات) و رفتارها (متدها) میشوند.
در این مقاله، مفهوم کلاس در C#، نحوه تعریف آن، انواع اعضای کلاس، اصول شیءگرایی مرتبط و مفاهیم پیشرفته بررسی خواهند شد.
۱. تعریف کلاس در C#
در C#، کلاس با استفاده از کلمه کلیدی class تعریف میشود. یک کلاس میتواند شامل متغیرها، خصوصیات، متدها و رویدادها باشد. در ادامه یک نمونه ساده از کلاس آورده شده است:
public class Car
{
public string Brand;
public string Model;
public int Year;
public void DisplayInfo()
{
Console.WriteLine($"Brand: {Brand}, Model: {Model}, Year: {Year}");
}
}
۲. ایجاد شیء از کلاس
برای استفاده از کلاس، باید یک نمونه (Object) از آن ایجاد کنیم:
class Program
{
static void Main()
{
Car myCar = new Car();
myCar.Brand = "Toyota";
myCar.Model = "Corolla";
myCar.Year = 2022;
myCar.DisplayInfo();
}
}
در این کد:
• یک شیء myCar از کلاس Car ساخته شده است.
• مقادیر فیلدهای آن مقداردهی شدهاند.
• متد DisplayInfo برای نمایش اطلاعات خودرو فراخوانی شده است.
۳. فیلدها، خصوصیات و متدها
فیلدها (Fields)
فیلدها متغیرهایی هستند که دادههای کلاس را نگهداری میکنند. در مثال قبل، Brand، Model و Year فیلد بودند.
خصوصیات (Properties)
خصوصیات راهی استاندارد برای دسترسی ایمن به دادههای کلاس هستند. به جای استفاده مستقیم از فیلدها، میتوان از property استفاده کرد:
public class Car
{
private string brand;
public string Brand
{
get { return brand; }
set { brand = value; }
}
}
استفاده از property باعث افزایش امنیت و کنترل بیشتر بر روی دادهها میشود.
متدها (Methods)
متدها وظایف خاصی را در کلاس انجام میدهند. در مثالهای قبل، DisplayInfo() یک متد بود که اطلاعات را چاپ میکرد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
👍6❤3
پشتیبانی از عملگر LeftJoin در NET 10.
در نسخه جدید NET 10.، پشتیبانی بومی از عملگر
قبل از NET 10.:
در نسخههای قبلی EF Core، برای استفاده از عملیات
مثال کد قبل از NET 10.:
پس از اضافه شدن LeftJoin در NET 10.:
با معرفی متد
مثال کد پس از NET 10.:
مزایای استفاده از LeftJoin در NET 10.:
- سادگی و خوانایی بیشتر: به جای استفاده از ترکیب پیچیدهی متدها، میتوانید با یک متد ساده به راحتی
- عملکرد بهتر: به دلیل بهینهسازیهای داخلی در EF Core، عملیات
- کاهش پیچیدگی کد: به جای کدهای طولانی و پیچیده، میتوانید کدهای سادهتری بنویسید که فهم آنها برای سایر برنامهنویسان راحتتر است.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
در نسخه جدید NET 10.، پشتیبانی بومی از عملگر
LeftJoin در LINQ به این فریمورک اضافه شده است. این تغییر مهم در زمان نوشتن کوئریها در Entity Framework Core (EF Core) به شما کمک میکند تا کد سادهتری بنویسید و از پیچیدگیهای قبلی که نیازمند استفاده از ترکیب چندین متد مانند SelectMany و GroupJoin بود، رهایی یابید.قبل از NET 10.:
در نسخههای قبلی EF Core، برای استفاده از عملیات
LeftJoin نیاز به ترکیب چندین متد پیچیده بود. در این روش، ابتدا با استفاده از GroupJoin دادهها را به هم پیوند میدادیم، سپس از SelectMany و DefaultIfEmpty برای شبیهسازی رفتار LeftJoin استفاده میکردیم.مثال کد قبل از NET 10.:
var query = students
.GroupJoin(
departments,
student => student.DepartmentID,
department => department.ID,
(student, departmentList) => new { student, subgroup = departmentList })
.SelectMany(
joinedSet => joinedSet.subgroup.DefaultIfEmpty(),
(student, department) => new
{
student.student.FirstName,
student.student.LastName,
Department = department.Name ?? "[NONE]"
});
پس از اضافه شدن LeftJoin در NET 10.:
با معرفی متد
LeftJoin در NET 10.، نوشتن کوئریها بسیار سادهتر و خواناتر شده است. دیگر نیازی به استفاده از ترکیب چندین متد نخواهید داشت، بلکه میتوانید به راحتی از این متد جدید استفاده کنید.مثال کد پس از NET 10.:
var query = context.Students
.LeftJoin(
context.Departments,
student => student.DepartmentID,
department => department.ID,
(student, department) => new
{
student.FirstName,
student.LastName,
Department = department.Name ?? "[NONE]"
});
مزایای استفاده از LeftJoin در NET 10.:
- سادگی و خوانایی بیشتر: به جای استفاده از ترکیب پیچیدهی متدها، میتوانید با یک متد ساده به راحتی
LeftJoin را انجام دهید.- عملکرد بهتر: به دلیل بهینهسازیهای داخلی در EF Core، عملیات
LeftJoin به شکل بهینهتری در پایگاه داده اجرا میشود.- کاهش پیچیدگی کد: به جای کدهای طولانی و پیچیده، میتوانید کدهای سادهتری بنویسید که فهم آنها برای سایر برنامهنویسان راحتتر است.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
________
GitHub
core/release-notes/10.0/preview/preview1/efcore.md at main · dotnet/core
.NET news, announcements, release notes, and more! - dotnet/core
👍20❤6
🔶 امشب ساعت ۸:۳۰ تو این لایو یوتیوب قراره در مورد مفاهیم LLM و روشهای برنامهنویسی باهاشون در داتنت صحبت کنیم، و در نهایت هم نحوه ساختن و استفاده کردن از MCP ها رو بررسی کنیم.
#dotnet #csharp #openai #llm #azure #mcp
#cs_internship
https://www.youtube.com/live/c75VZWa_wbU
کانال تلگرام:
@SoftwarePhilosophy
____
#dotnet #csharp #openai #llm #azure #mcp
#cs_internship
https://www.youtube.com/live/c75VZWa_wbU
کانال تلگرام:
@SoftwarePhilosophy
____
YouTube
LLMs + MCP in C#!
Let's see how we can use MCP servers/clients in our .NET applications!
Here Mehran and I will discuss about LLMs and MCP in C#!
Mehran's LinkedIn:
https://www.linkedin.com/in/mehrandvd
🎙️ New to streaming or looking to level up? Check out StreamYard and…
Here Mehran and I will discuss about LLMs and MCP in C#!
Mehran's LinkedIn:
https://www.linkedin.com/in/mehrandvd
🎙️ New to streaming or looking to level up? Check out StreamYard and…
1👍12❤9🔥3
نوع داده char در زبان سیشارپ
#csharp_for_beginners
در زبان برنامهنویسی #C، نوع دادهای char نمایانگر یک واحد کد UTF-16 یونیکد است که معمولاً به عنوان یک کاراکتر UTF-16 شناخته میشود. کلمه کلیدی char در #C معادل ساختار System.Char در .NET است.
ویژگیهای کلیدی نوع char:
محدوده مقادیر: از U+0000 تا U+FFFF
اندازه: 16 بیت
مقدار پیشفرض: \0 یا U+0000
عملگرهای پشتیبانیشده برای char:
مقایسهای: مانند == و !=
افزایشی و کاهشی: مانند ++ و --
عملگرهای حسابی و بیتی: این عملگرها بر روی کد پوینتهای مربوطه عمل کرده و نتیجه را به صورت مقدار int ارائه میدهند.
تبدیل نوع char:
تبدیل ضمنی به انواع عددی: char به طور ضمنی قابل تبدیل به انواع عددی صحیح مانند ushort، int، uint، long، ulong، nint و nuint است. همچنین، به انواع عددی اعشاری مانند float، double و decimal نیز قابل تبدیل است.
تبدیل صریح از انواع دیگر به char: تبدیل از سایر انواع به char به
صورت صریح انجام میشود.
مثالهایی از مقداردهی به char:
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در زبان برنامهنویسی #C، نوع دادهای char نمایانگر یک واحد کد UTF-16 یونیکد است که معمولاً به عنوان یک کاراکتر UTF-16 شناخته میشود. کلمه کلیدی char در #C معادل ساختار System.Char در .NET است.
ویژگیهای کلیدی نوع char:
محدوده مقادیر: از U+0000 تا U+FFFF
اندازه: 16 بیت
مقدار پیشفرض: \0 یا U+0000
عملگرهای پشتیبانیشده برای char:
مقایسهای: مانند == و !=
افزایشی و کاهشی: مانند ++ و --
عملگرهای حسابی و بیتی: این عملگرها بر روی کد پوینتهای مربوطه عمل کرده و نتیجه را به صورت مقدار int ارائه میدهند.
تبدیل نوع char:
تبدیل ضمنی به انواع عددی: char به طور ضمنی قابل تبدیل به انواع عددی صحیح مانند ushort، int، uint، long، ulong، nint و nuint است. همچنین، به انواع عددی اعشاری مانند float، double و decimal نیز قابل تبدیل است.
تبدیل صریح از انواع دیگر به char: تبدیل از سایر انواع به char به
صورت صریح انجام میشود.
مثالهایی از مقداردهی به char:
var chars = new[]
{
'j',
'\u006A', // استفاده از توالی فرار یونیکد
'\x006A', // استفاده از توالی فرار هگزادسیمال
(char)106, // تبدیل عدد صحیح به char
};
Console.WriteLine(string.Join(" ", chars)); // خروجی: j j j j
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
The char type - C# reference
Learn about the built-in character type in C#
👍8❤2🔥1
قابلیتهای جدید Data Annotations در دات نت ۸
در نسخه جدید NET 8.، ویژگیهای Data Annotations پیشرفتهای قابل توجهی داشتهاند. این ویژگیها، کدنویسی معتبرسازی دادهها را بسیار سادهتر و تمیزتر کرده است. در ادامه به صورت گام به گام این ویژگیهای جدید را بررسی میکنیم:
۱. ویژگی Length
این Annotation برای مشخص کردن حداقل و حداکثر طول رشته استفاده میشود.
در مثال بالا:
- مقدار
- مقدار
---
۲. ویژگی Range با پارامترهای Exclusive
ویژگی
در این مثال:
- مقدار
---
۳. ویژگی AllowedValues
این Annotation مقادیر مجاز برای یک خصوصیت را مشخص میکند.
در اینجا، تنها مقادیر
---
۴. ویژگی DeniedValues
برای مشخص کردن مقادیری که غیرمجاز هستند استفاده میشود.
در این مثال، مقادیر
---
۵. ویژگی Base64String
برای معتبرسازی اینکه مقدار یک رشته به صورت
این اطمینان را ایجاد میکند که
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
__________
در نسخه جدید NET 8.، ویژگیهای Data Annotations پیشرفتهای قابل توجهی داشتهاند. این ویژگیها، کدنویسی معتبرسازی دادهها را بسیار سادهتر و تمیزتر کرده است. در ادامه به صورت گام به گام این ویژگیهای جدید را بررسی میکنیم:
۱. ویژگی Length
این Annotation برای مشخص کردن حداقل و حداکثر طول رشته استفاده میشود.
[Length(2, 30)]
public string Name { get; set; }
[Length(2, 255)]
public string Denoscription { get; set; }
در مثال بالا:
- مقدار
Name باید حداقل ۲ و حداکثر ۳۰ کاراکتر داشته باشد.- مقدار
Denoscription باید حداقل ۲ و حداکثر ۲۵۵ کاراکتر داشته باشد.---
۲. ویژگی Range با پارامترهای Exclusive
ویژگی
Range حالا قابلیت مشخص کردن مقادیر انحصاری را نیز دارد.[Range(1, 1000, MinimumIsExclusive = true, MaximumIsExclusive = false)]
public decimal Price { get; set; }
در این مثال:
- مقدار
Price باید بزرگتر از ۱ (به دلیل MinimumIsExclusive = true) و کوچکتر یا مساوی ۱۰۰۰ (به دلیل MaximumIsExclusive = false) باشد.---
۳. ویژگی AllowedValues
این Annotation مقادیر مجاز برای یک خصوصیت را مشخص میکند.
[AllowedValues("S", "M", "L", "XL", "XXL")]
public string Size { get; set; }در اینجا، تنها مقادیر
S, M, L, XL, XXL برای Size قابل قبول هستند.---
۴. ویژگی DeniedValues
برای مشخص کردن مقادیری که غیرمجاز هستند استفاده میشود.
[DeniedValues("Electronics", "Computers")]
public string Category { get; set; }در این مثال، مقادیر
Electronics و Computers برای Category ممنوع هستند.---
۵. ویژگی Base64String
برای معتبرسازی اینکه مقدار یک رشته به صورت
Base64 باشد استفاده میشود.[Base64String]
public string Image { get; set; }
این اطمینان را ایجاد میکند که
Image حاوی یک رشته معتبر Base64 است.🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
__________
Docs
System.ComponentModel.DataAnnotations Namespace
Provides attribute classes that are used to define metadata for ASP.NET MVC and ASP.NET data controls.
1👍20❤3🔥2