Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
445 - Telegram Web
Telegram Web
شما یک Geek هستید یا nerd ؟

یک Geek کیست؟
یک گیک (Geek) کسی است که بسیار باهوش و آگاه حتی در مرحله ای از وسواس فکری در مورد یک موضوع خاص است. گیک (Geek) کسی است که وقتیدر یک مسیر اصلی قرار میگیرد یک کشش یا علاقه ی وافری را کسب میکند و در اصطلاح کسی است که با رفتار عجیب غریب اش تعریف میشود ولی معانی دیگری مانند متخصص یا علاقمند رایانه نیز دارد همچنین در بعضی مفاهیم “رایانه باز” هم میگویند.
گیک‌ها اصولا درس و دانشگاه را بیخیال شده‌اند و پی علاقه خود می‌روند. مدیران اغلب شرکت های بزرگ فناوری دنیا، از دسته گیک‌ها به شمار میایند.


یک nerd کیست؟
شخصی است که از نظر فکری روی یک موضوع خاص تمرکز شدید دارد و از نظر اجتماعی با مشکل مواجه است در حقیقت. فرد نرد (nerd ) زمان زیادی را صرف کارهایی میکند که برای عموم مردم جذاب نیست.
به کسانی گفته می‌شود که دانشی قدرتمند در زمینه‌ خاصی دارند ولی این دانش را نه برای پول و نه برای مقبولیت اجتماعی، بلکه به خاطر دل خودشان بدست میاورند. نردها معمولا از طرف اجتماعات مختلف طرد می‌شوند، در ارتباط با جنس مخالف دچار مشکل هستند، ظاهر ژولیده‌ای دارند و اگر کسی پیدا نشود که از نبوغشان استفاده کند از لحاظ مالی دچار مشکل می‌شوند. با این‌حال هیچ کدام از اینها برایشان اهمیتی ندارد و می توانند با ساعاتی کد زدن! همه آن را فراموش کنند.

مقایسه یک Geek و nerd

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

نرد ها دوست دارند از لهجه خاصی یا لغات و اصطلاحات عجیب و ناشناخته ای در گفتگو هایشان استفاده کنند در حالیکه گیک ها به ندرت از منبع های گنگ و نامفهوم استفاده خواهند کرد .
گیک ها اغلب به جزییات جهان کوچک زندگی علاقمند هستند مانند توجه به موقعیت درحال حاضر شما که بیشتر به یک مقاله خبری یا یک رمان است.نرد ها ظاهرا علاقمند به جزییات زندگی روزانه نیستند بیشتر روی مسائل قابل رویت و بزرگ تمرکز میکنند مثل احتمالات علمی و آینده بشریت.
یک گیک (Geek) توانایی های اجتماعی معمولی دارد اگر چه آن ها میتوانند پر مدعا و پرگو باشند مخصوصا وقتی مسئله ای در زمینه علاقه ها و تعصباتشان اتفاق میوفت در این صورت به شما اجازه رفتن نمیدهند تا وقتی که مثلا طرز کار فلان چیز ویا سرگذشت فلان کس ویا وجود آمدن فلان قسمترا دقیقا توصیح دهند.
یک نرد (Nerd) معمولا دورنگرا است آن ها ممکن است یک حجم بزرگی را درمورد دقیقا همان چیزی که یک گیک (Geek) در ان تخصص یافته است بدانند اما آن ها همان چیز را با حرف زدن و بحث کردن انجام بعضی کارها بدست می آورند.
یک حقیقت کلی است که گیک ها میتوانند فکر و ذکر هر کسی را مشغول کنند و یا به عبارت دیگر هر کسی را دوست داشته باشند.(اگر چه خلاف آن ممکن است درست نباشد)
با این حال بیشتر نرد ها فقط هم گروه های خود را دوست دارند یعنی همان نردها .
گیک ها روابط اجتماعی خوبی دارند، بازی های دسته جمعی بیشتری انجام می‌دهند، به کافه می روند و اگر کسی را پیدا کنند که به گجت مورد علاقه آنها، گوشه علاقه‌ای نشان دهد تا وقتی که تمام ابعاد گجت و سن مادربزرگ سازنده اسپیکرهای گجت را نگفته‌اند، بیخیال نخواهند شد. از سوی مقابل، نردها هرچند ممکن است اطلاعات دقیق‌تری راجع به همان گجت داشته باشند ولی به محرک بسیاری قوی‌تری برای صحبت راجع به آن نیاز دارند، آنها بیشتر با کسانی که بعنوان نرد قبولشان کرده اند در ارتباط اند و در اکثر مواقع برای ازدواج خود یک نرد را انتخاب می کنند. در حالی که یک گیک، ممکن است یک مدل لباس را هم برای ازدواج انتخاب کند.
تعداد افرادی که خود را گیک می‌نامند و یا بقیه آنها را بعنوان نرد می‌شناسند هر روز در حال افزایش است. عضویت در جامعه‌ای متمایز که زبان و ادبیات مخصوص به خود را دارد و در اکثر مواقع به دنبال تبدیل کردن دنیا به جای بهتری برای زندگی کردن است، می‌تواند دلایل منطقی و روانی بسیاری داشته باشد. سرمایه گذاری تبلیغاتی کشورهای توسعه یافته روی این موضوع و تولید سریال های پرطرفداری مانند big bang theory و IT CROWDS نشان از اهمیت فعالیت های نسل نردها و گیک‌ها دارد.

@fullStackDevs

مترجم خانم افسانه عابدینی
منبع :
http://alihossein.ir/tutorials/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-geek-nerd-%DA%86%DB%8C%D8%B3%D8%AA
Web Devs
#قسمت_اول #MessagePack در این پست به معرفی یک فرمت سریالایز و دیسریالاز که بسیار سریع و ساده و جمع و جور می باشد میپردازیم. 🔸 مشکل کجاست ؟ مشکل آنجایی مطرح میشود که حجم تبادل دیتا بسیار زیاد و روال سریالاز و دیسریالاز کردن آن برای انتقال، بسیار سنگین…
#قسمت_دوم
#قسمت_آخر
#MessagePack

در این قسمت به معرفی نیوگت پکیج هایی برای راه اندازی و استفاده از MessagePack در Asp.NetCore می پردازیم.
به صورت توکار این قابلیت برای فریم وورک AspNetCore پیاده سازی نشده و بایستی با نصب Third party library هایی از آن استفاده کنید .همچنین می توانید از MessagePack به همراه SignalR و WebApi و برنامه های کنسول اپلیکیشنی و ویندوز اپلیکیشنی و .. با نصب نیوگت پکیج مربوطه استفاده کنید.
کتابخانه های بسیاری برای اینکار وجود دارد که در اینجا به معرفی تعدادی از آنها میپردازیم.

مشهورترین آنها
🔹 Install-Package MessagePack
میباشد که Documentation کامل و مفصل آن را در این ریپازیتوری میتوانید مشاهده و مطالعه کنید.
این کتابخانه Extension های زیادی دارد که یکی از آنها
🔹Install-Package MessagePack.AspNetCoreMvcFormatter
است که به شما امکان استفاده از MessagePack در AspNetCoreMvc را میدهد. برای استفاده و فعالسازی سرویس های آن در AspCoreMvc و طریقه کانفیگ کردن و استفاده از آنرا را در این لینک می توانید ببینیید.
از دیگر پکیج ها برای استفاده از MessagePack پکیج
🔹Install-Package WebApiContrib.Core.Formatter.MessagePack
میباشد.که بعد از نصب آن میتونید با افزودن سرویسش در ConfigureServices از آن استفاده کنید.توضیحات مختصری از این پکیج و نحوه کانفیگ در این لینک قابل دسترس است.
همانطور که گفتیم از MessagePack به همراه سیگنال آر نیز میتوانید استفاده کنید . برای اینکار بایستی پکیج
🔹Install-Package Microsoft.AspNetCore.SignalR.Protocols.MessagePack
را نصب کرده و از آن استفاده کنید .Documentation در این لینک .
همچنین اگر دارید از سیگنال آر با یک Client جاوااسکریپتی استفاده میکنید باید npm پکیج زیر
🔹npm install @aspnet/signalr-protocol-msgpack
که شامل اسکریپت های مورد نیاز برای استفاده از MessagePack در سمت Client به همراه سیگنال آر هست را نصب کنید.Documentation در این لینک .

📢 @fullStackDevs
Forwarded from Web Devs
Web Devs
Photo
#NewVersion
#ABluePersianDateTimePicker
توضیحات تکمیلی


نحوه استفاده از این picker به صورت زیر به صورت میلادی و شمسی می باشد . میتونید اچ تی ام ال این صفحه را مشاهده کنید و المنت های خودتونو به سادگی بسازید و به دلخواه css هارو تغییر دهید.
🔹 با اتریبوت زیر پلاگین فعال میشوند
data-abdatetimepicker="true"

🔹 با اتریبوت زیر روزهای قبل امروز غیر فعال میشوند

data-disablebeforetoday="true"

🔸 با اتریبوت زیر مشخص میکنید وقتی روی تاریخی انتخاب کردین مقدار کجا وارد شود

data-targetselector="[data-name='end-date']"

🔹 با اتریبوت زیر میتونید تعیین کنید با کدام ایونت روی المنت فعال شود مثل
data-trigger="click"

🔸 با اتریبوت زیر روزهای قبل امروز غیر فعال میشوند

data-disablebeforetoday="true"

🔹 با اتریبوت زیر میتوانید روزهای بعد از روز جاری را غیر فعال کنید:

data-disableaftertoday="true"

🔸 با اتریبوت زیر میتوانید تعیین کنید وقتی پلاگین باز میشود در کجای المنت باز شود مثلا وقتی میخوایین بالای المنت پلاگین باز شود :
data-Placement="top"

🔹 با اتریبوت زیر میتونید تاریخ میلادی را استفاده کنید

data-isgregorian="true"

🔸 با اتریبوت زیر میتونید ساعت دقیقه ثانیه رو نمایش ندید

data-enabletimepicker="true"

البته یه سمپل page زمانی که پکیج رو نصب کنید توی فولدر Static به نام SampleDateTime.html اضافه خواهد شد که شما میتونید سمپل تگ استفاده از این پلاگین رو ببینید.

✔️ ورژن جدید ریلیز شده :

Install-Package ABluePersianDateTimePicker -Version 1.0.5
dotnet add package ABluePersianDateTimePicker --version 1.0.5
<PackageReference Include="ABluePersianDateTimePicker" Version="1.0.5" />
paket add ABluePersianDateTimePicker --version 1.0.5

@fullStackDevs
#OAuth


در این پست می آموزیم که OAuth چیست.
درابتدا باید بدانیم که OAuth مخفف Open Authorization میباشد.
🔳 OAuth
یک پروتکل برای اهدای مجوز برای دسترسی به اطلاعات کاربر توسط اپلیکیشنی دیگر است.

🔸 این پروتکل ابتدا در سال 2007 معرفی شد و توسط توییتر استفاده شد و با توجه به استقبال و گستردگی ان در سال 2010 نسخه OAuth 2.0 توسط IEFT (جامعه بین المللی آزاد از طراحان شبکه ، اپراتورها ، فروشندگان و محققانی است که بر روی تدوین استانداردهای فنی برای اینترنت کار می کنند.) معرفی شد.

▪️ برای مثال ممکن است موقع ثبت نام در سایتی گزینه هایی همچون “login with Google” یا “login with Facebook” را دیده باشید که عملیات login را بسیار ساده میکند و با اعطای مجوز دسترسی به اطلاعاتتان به سایتی که میخواهید در آن حساب بسازید عملیات ورود و ساخت حساب را انجام میدهید.
سه اجزایی که در یک مکانیزم OAuth وجود دارند عبارتند از :
1️⃣ OAuth Provider,Resource Provider
سرویسی که با دریافت تاییدیه امکان استفاده از اطلاعات کاربر را به یک اپلیکیشن دیگر میدهد. مانند گوگل ، فیس بوک و... که بایستی پروتکل OAuth را پیاده سازی کرده باشد.
2️⃣ OAuth Client
وب سایت یا اپلیکیشنی که اجازه دسترسی به اطلاعاتمان را به آن میدهیم.
3️⃣ Resource Owner

شخصی که اطلاعات آن در اختیار Resource Provider است.
طی این فرایند شما با اعطای مجوز به OAuth Client و دریافت یک access token این امکان را به OAuth Client میدهید که به اطلاعات شما از طریق آن access token دسترسی داشته باشد .

@fullStackDevs
#OpenID


💡 What is Open ID?

در پست های قبل به OAuth پرداختیم و گفتیم که این پروتکل مختص به Authorization است و با ارائه یک توکن دسترسی اجازه استفاده از اطلاعات را میدهد و اپلیکیشن جانبی مان اطلاعاتی در مورد کاربر جاری که از این توکن استفاده میکند ،ندارد.

اما اپن آیدی پروتکلی برای authentication و تصدیق هویت میباشد این پروتکل لایه ای بر روی OAuth 2.0 میباشد .
با استفاده از این پروتکل، Token ID ای دریافت میکنید که JWT بوده و اپلیکیشن جانبی تان علاوه بر دسترسی از طریق این توکن اطلاعاتی هم درباره کاربر جاری دارد.
اپن آیدی اجازه استفاده از یک حساب(اکانت) برای چندین سایت بدون اینکه نیاز به تغییر رمز عبور داشته باشید میدهد.

💢 مراحل انجام کار

1. ارسال اطلاعات کلاینت به Identity Provider
2. دریافت این اطلاعات در سمت Identity Provider و شناسایی و لاگین کاربر
3. ارسال یک Access Token و یک ID Token (اگر کلاینت درخواست کند) از سمت identity Provider به کلاینت.
4. دریافت این توکن ها در سمت کلاینت و کلاینت میتواند با استفاده از Access Token درسمت Identity Provider برای دسترسی به اطلاعات api هایی رو صدا بزند و همچنین از ID Token برای بازیابی اطلاعات کاربر استفاده کند.

این پروتکل برای اولین بار در سال 2005 معرفی و پیاده سازی شد و نسخه بعدی آن که OpenID Connect نامیده میشود در فوریه 2014 ارئه گردید.


@fullStackDevs
نمونه ای از یک سیستم فروش بیمه ای بسیار ساده است که با استفاده از یک معماری Microservice ارائه شده است ، بعضی از تکنولوژی های استفاده شده :
▪️.NET Core 2.1
▪️Entity Framework Core
▪️MediatR
▪️JWT Tokens
▪️RawRabbit
▪️NHibernate
▪️Dapper
▪️SignalR
▪️DDD
▪️CQRS
...
🔲 Running with Docker
لینک سورس در گیت هاب

@fullStackDevs
#DesignPatterns

در مهندسی نرم افزار الگو های طراحی یک راه حل عمومیه تکرار پذیر برای حل یک مشکل رایج در هنگام طراحی نرم افزار می باشد.
به عبارتی الگو های طراحی یک راه کار نهایی که به طور مستقیم میتوان انرا به کد تبدیل کرد نیست بلکه توضیح یا قالبی است برای اینکه ، چطور میتوان مشکلی که به راه های متفاوت پدیدار میشود را حل کرد.
الگو های طراحی روند سرعت توسعه نرم افزار را با ارائه روش های تست شده افزایش میدهند.
یک طراحی موثر و تاثیر گذاری نیازمند مسائلی است که ممکن است تا زمان پیاده سازی قابل رویت نباشد .
استفاده از الگوهای طراحی باعث جلوگیری از مسائل جرئی که بروز مشکلاتی بزرگ را دربر دارد، میشوند.
استفاده از الگوهای طراحی باعث میشود که کد شما قابل انعطاف تر و نگهداری آن آسان تر و همچنین راحتر بتوان دوباره از ان استفاده کرد و هیچ لزومی ندارد که همیشه این الگوهای طراحی را در پروژه های خود استفاده کنید ،الگوهای طراحی برای توسعه پروژه منظور نمی شوند بلکه برای حل مسائل متداول در نظر گرفته شده اند.هر وقت که به آنها نیاز داشتید بایستی الگوی مناسبی برای جلوگیری از بروز چنین مشکلی در آینده پیاده سازی کنید برای تشخیص اینکه برای چه مشکلی از چه الگویی استفاده کنید فقط باید سعی کنید که الگو های طراحی و مهم تر از ان هدف از هر الگو را درک کنید
الگوهای طراحی براساس هدف هر الگو به سه دسته تقسیم میشوند.
🔹Behavioural
🔸Creational
🔹Structural

1️⃣ Creational
این نوع الگو ها در مورد نحوه نمونه سازی از کلاس ها میباشند و انها را میتوان به class-creation و object-creational دسته بندی کرد.این به این معنی است که در زمان انجام Job و پیاده سازی الگو برای دسترسی به ویژگی های یک کلاس یا میتوان از طریق ارث بری از ویژگی های ان استفاده کرد یا اینکه با ساخت یک نمونه از کلاس هدف به ویژگی های ان نیز دسترسی داشت.
الگو های Creational عبارتند از :
Factory Method, Abstract Factory, Builder, Singleton, Object Pool, Prototype

2️⃣ Structural
این نوع از الگوها مربوط به سازماندهی کلاس ها و اشیاء مختلف برای تشکیل ساختارهای بزرگتر و ارائه قابلیت های جدید است.
الگو های Structural عبارتند از :
Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Private Class Data, Proxy

3️⃣ Behavioral
این نوع از الگو ها در مورد شناسایی الگوهای ارتباطی مشترک بین اشیاء و تحقق این الگوهاست دروافع الگوهای رفتاری آن الگوهایی هستند که به طور خاص به ارتباط بین اشیاء مربوط می شوند.
الگو های Behavioral عبارتند از :
Command, Interpreter, Iterator, Mediator, Memento, Null Object, Observer, State, Strategy, Template method, Visitor

در ادامه نیز به بررسی این الگو ها میپردازیم.

💎 Acting out rather than speaking out became a pattern 💎


@fullStackDevs
👍1
#PersianDateTime
#CSharp
🔹 ساختار تاریخ شمسی با متد های تبدیل به تاریخ میلادی و یا هجری
🔸 متدهای مختلف برای بدست آوردن رشته های مختلف تاریخ شمسی با فرمت های متفاوت و اعداد فارسی
🔹 پشتیبانی از سال کبیسه
🔸 شبیه سازی کامل ساختار DateTime
.NetFramework 4.5

نصب پکیج :

Install-Package ABluePersianDateTime -Version 1.0.5
dotnet add package ABluePersianDateTime --version 1.0.5
paket add ABluePersianDateTime --version 1.0.5

@fullStackDevs
#EF_Core3
#FromSqlRaw
#ExecuteSqlRaw
🔹 بررسی تغییرجدیدی که از preview 4 بروی EF Core 3.0 اعمال شده است.
در نسخه های قبلی از این متد FromSql برای اجرای یک raw SQL query به صورت مستقیم استفاده میشد.
اما در نسخه جدید (3.0) از متد های

FromSqlRaw ، ExecuteSqlRaw ExecuteSqlRawAsync

برای اجرای یک raw SQL query که پارامتر های آن به صورت جدا در کوئری استرینگ مقدار دهی میشوند، استفاده میشوند.این متد ها جایگزین متد FromSql شده اند.

context.Products.FromSqlRaw(
"SELECT * FROM Products WHERE Name = {0}",
product.Name);

همچنین از متدهای

FromSqlInterpolated, ExecuteSqlInterpolated, ExecuteSqlInterpolatedAsync

برای اجرای یک raw SQL query استفاده میشوند با این تفاوت که در این متدها پارامتر های کوئری در مابین کوئری استرینگ و نه به صورت جدا مقداردهی میشوند.

context.Products.FromSqlInterpolated(
$"SELECT * FROM Products WHERE
Name = {product.Name}"
);

تغییر دیگری که در نسخه جدید اتفاق افتاده است محل صدا زدن این متد هاست. در نسخه های قبل تر از (3.0 )متد FromSql را در هر جای کوئری لینک خود میتوانستید صدا بزنید اما از در نسخه جدید متد های جایگزین شده را فقط مستقیما بروی DbSet<> می توانید صدا بزنید.
هدف از انجام این تغییر هم فقط برای جلوگیری از ابهام در کوئری، آن هم در سناریوهای خاص بوده است.

@fullStackDevs
در EF و همچنین Ef Core برای انجام Configuration هایی بروی Entity کلاس ها از Fluent API Configuration استفاده میکنیم و بایستی این Configuration ها را به ModelBuilder معرفی کنید. عموما میبینیم که برای انجام اینکار ، Extension Method ای مینویسند و با Reflection این کار را انجام میدهند اما خود Ef و Ef core متدی برای انجام اینکار دارد و اصلا نیازی به نوشتن Extension Method نیست .
این متد به عنوان پارامتر ورودی،اسمبلی ای که Configuration های شما در آن قرار دهد را دریافت میکند , پارامتر بعدی که میتوانید به این متد پاس دهید predicate ای برای اعمال Limitation هایی میباشد .با این متد میتوانید تمامیه Configuration هایی که باید به ModelBuilder افزوده شوند را Apply کنید.
#Value_Conversions
#EFCore

🧩 Value Conversions

این ویژگی در EF Core 2.1 اضافه شد.
ویژگی Value Conversion امکان تبدیل مقادیر پراپرتی ها به تایپ های مشخص در هنگام خواندن یا نوشتن در دیتابیس را میدهد.
این تبدیل میتواند از یک نوع به همان نوع یا از یک نوع به نوع دیگر باشد مانند تبدیل مقادیر enum به string و برعکس.
برای مثال برای ذخیره مقادیر enum بصورت string به شکل زیر میتوانیم عمل کنیم :

public class Rider
{
public int Id { get; set; }
public EquineBeast Mount { get; set; }
}

public enum EquineBeast
{
Donkey,
Mule,
Horse,
Unicorn
}
و سپس برای اینکه مقادیر این enum در دیتابیس به صورت string ذخیره شود ، به این صورت "Donkey", "Mule" بایستی Value Conversion ای بدین شکل تعریف کنیم .
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(
v => v.ToString(),
v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
}

یا به عنوان مثال حتما تا کنون برای شما پیش آمده که در درون Entity Class خود برای یک پراپرتی از Complex type استفاده کرده باشد.
مثلا برای نگه داری مقدار پول به جای استفاده از type های decimal یا int ، از یک custom type که خود انرا تعریف کرده اید استفاده کرده باشید.

public class MyEntity
{
...
public Money salary { get; set; }
//Money is a class, actually it's my custom type
}
برای ذخیره چنین type هایی در دیتابیس و واکشی انها در قالب custom type مان، میتوانیم از ویژگی Value conversion کمک بگریم.
برای انجام اینکار بایستی برای پراپرتی salary (در مثال بالا) یک ValueConverter در متد OnModelCreating در Context بسازیم اینکار به دو صورت قابل انجام است .
روش اول
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyEntity>()
.Property(b => b.Salary )
.HasConversion(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<Money>(v));
}
و روش دوم
var converter = new ValueConverter<Money, string>(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<Money>(v));

modelBuilder
.Entity<MyEntity>()
.Property(e => e.Salary)
.HasConversion(converter);

✔️ توجه داشته باشد که برای ذخیره شی Money در دیتابیس و واکشی آن از دیتابیس در قالب یک Money روال سریالایز و دیسریالایز کردن آن به Json نیازمند است.

روش دوم برای مواردی که دو پراپرتی از یک value converter استفاده میکنند مناسب است.
*نکته مقادیر null به value converter پاس داده نمیشوند.
خود Ef Core نیز کلاس های value converter از پیش تعریف شده ای دارد که در فضای نام
Microsoft.EntityFrameworkCore.Storage.ValueConversion
وجود دارند .که لیستی ار آنها را در این لینک میتوانید ببینید.به همین خاطر EF Core با دارا بودن لیستی از این value converter بسیاری از تبدیلات نوع ها به نوع های دیگر در هنگام ذخیره مقادیر در دیتابیس را به صورت اتوماتیک انجام میدهد در واقع این امر زمانی مشخص میشود که DataBase Provider خود را مشخص و کانفیگ میکنید.
مثلا مثال enum بالا را میتوانید با value converter های خود ef core انجام دهید.

var converter = new EnumToStringConverter<EquineBeast>();

modelBuilder
.Entity<Rider>()
.Property(e => e.Mount)
.HasConversion(converter);

🎯 و نکته اخر اینکه
با مشخص کردن نوع یک پراپرتی به صورت صریح به کمک اتریبیوت
 [Column(TypeName = "TypeName")]
می توان همین کار را انجام داد و Ef Core متوجه میشود که باید مقدار این پراپرتی رو در هنگام ذخیره در دیتابیس به نوع مورد نظر تبدیل کند.
این ویژگی هنوز محدودیت هایی دارد برای مثال :
-مقادیر null نمیتوانند تبدیل شوند
-امکان اعمال یک value converter به صورت کلی برای دسته ای از پراپرتی ها نیست و باید به صورت تک به تک اعمال شوند.
-استفاده از value conversions ممکن است توانایی EF Core را برای ترجمه عبارات به SQL تحت تأثیر قرار دهد.


@fullStackDevs
#High_Performance
#EfCore_Best_Practice
#DbContext_pooling

🔸 در این پست به معرفی یک روش جدید Register کردن DbContext به Di Container در متد ConfigureServices در کلاس Startup می پردازیم.
ابتدایی ترین و ساده ترین روش که برای Register کردن custom DbContext خود به سیستم dependency injection استفاده میکنیم تا بعدا نمونه ای از custom DbContext خود به صورت constructor parameters و یا دیگر روش های دریافت Instance از DI، دریافت کنیم روش زیر است :
services.AddDbContext<
BloggingContext
>(options => options.UseSqlServer("ConnectionString"));

🔹 که Register کردن DbContext به این طریق به معنی ساختن یک instance جدید از DbContext برای هر Request میباشد که مطمئنا روال Instance سازی از DbContext هزینه هایی برای اپلیکیشن دارد.
در نسخه 2.0 از Ef Core روش جدید برای Register کردن DbContext به سیستم dependency injection معرفی شد که همانطور که در مثال بعدی خواهید به صورت شفاف مجموعه ای از موارد DbContext قابل استفاده مجدد را ارائه می دهد.

services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(
ConnectionString
));

▪️ اگر از این متد برای Register کردن DbContext استفاده کنید زمانیه که در اپلیکیشن درخواست نمونه ای جدید از DbContext داده شود ابتدا در Context Pool چک میشود که ایا نمونه ای از DbContext وجود دارد و اگر نمونه ای وجو داشت،در اختیار درخواست دهنده قرار میدهد.
در نهایت هنگامی که Request پردازش شد و کار ان با نمونه دریافت شده DbContext تمام شد، Ef تمامیه State های قابل ردیابی DbContext را که از آنها آگاه هست را reset کرده و DbContext inctance دوباره به Context Pool بر میگردد.
این روال از نظر مفهومی شبیه connection pooling در Ado.net است و از مزیت های آن میتوان به کاهش هزینه ساخت DbContext instance اشاره کرد.
استفاده از این متد البته باعث محدودیت های اندکی در متد OnConfiguring() در DbContext میشود.

🔻 نکته بسیار مهم

نکته مهم این است که اگر به صورت Custom مکانیزمی را در derived DbContext class خود پیاده کرده باشید که باعث نگه داری state ای شود و از انجایی که Ef core فقط state هایی که از آنها اگاه هست را reset میکند پس در نتیجه state که شما به صورت custom ایجاد کرده اید در DbContext instance باقی میماند و باعث share شدن آن در بین درخواست ها میشود.


@fullStackDevs
#Scrutor

Assembly scanning and decoration extensions for Microsoft.Extensions.DependencyInjection
Scrutor is not a dependency injection (DI) container itself, instead it adds additional capabilities to the built-in container.
The library itself is pretty simple; it provides a single extension method, Scan, along with a fluent API to IServiceCollection that allows you to register "services" based on conventions. That's it!

Useful for lazy Developers😉

Package Manager Console

Install-Package Scrutor

.NET Core CLI

dotnet add package Scrutor

by Kristian Hellang

MoreDetail
Documentation
GitHub

@fullStackDevs
Web Devs
#PersianDateTime #CSharp 🔹 ساختار تاریخ شمسی با متد های تبدیل به تاریخ میلادی و یا هجری 🔸 متدهای مختلف برای بدست آوردن رشته های مختلف تاریخ شمسی با فرمت های متفاوت و اعداد فارسی 🔹 پشتیبانی از سال کبیسه 🔸 شبیه سازی کامل ساختار DateTime .NetFramework 4.5 نصب…
#PersianDateTime
#CSharp
🔹 ساختار تاریخ شمسی با متد های تبدیل به تاریخ میلادی و یا هجری


✔️ اضافه کردن اپراتور منها برای بدست آوردن تفاضل دو تاریخ
مثال:
  PersianDateTime datetime1 = new PersianDateTime(_dateTime);
PersianDateTime datetime2 = new PersianDateTime(_dateTime.AddDays(-10));
var timeSpan = datetime1 - datetime2;

.NetFramework 4.5

🔳 در پست بعدی تو این هفته compatible با NetCore هم توی ناگت برای استفاده قرار داده میشود.

نصب پکیج :

Install-Package ABluePersianDateTime -Version 1.0.7
dotnet add package ABluePersianDateTime --version 1.0.7
paket add ABluePersianDateTime --version 1.0.7


@fullStackDevs
#Kotlin
#FreeCourse
#DevelopingAndroidApps

دوره رایگان برنامه نویسی اندروید با زبان برنامه نویسی Kotlin منتشر شده توسط شرکت گوگل

https://www.udacity.com/course/developing-android-apps-with-kotlin--ud9012


https://www.tgoop.com/fullStackDevs
#stackblitz

✔️در مرورگر شما
فقط با یک کلیک برنامه را کامل ایجاد ، ویرایش و استقرار کنید.

یه سایت خوب و کاربردی برای اینکه بتونید انلاین کدی رو چک کنید یا بتونید یه اپلیکیشنی به صورت سمپل درست کنید.
در واقع یه VS Code انلاین هستش که میتونید اپ های زیر را توسعه بدید:
🔹Angular
🔸React
🔹Ionic
🔸TypeScript
🔹RxJS
🔸Svelte

لینک سایت :
StackBlitz

@fullStackDevs
#Boxing
#UnBoxing

🧩 Boxing & unBoxing in C#

زبان برنامه نویسی سی شارپ دارای یک سیستم واحد نوع داده ای است. یعنی تمام دیتا تایپ ها در این زبان به صورت مستقیم یا غیر مستقیم از کلاس object ارث بری میکنندکه شامل value type ها و هم reference type ها میشود.
همانطور که میدانید متغیر های value type مستقیما دربردرانده دیتای خود هستند و دیتای آنها در حافظه stack ذخیره میشود. اما متغیر های reference type که به انها ابجکت گفته میشود، فقط reference ای از دیتای خود دارند و دیتای آن ها در حافظه managed heap ذخیره میشود.

زمانی که یک متغیر valute type را به یک متغیر reference type(آبجکت) اختصاص میدهید(assign) عمل Boxing اتفاق می افتد.
مثال :
int i = 24;
object ob = i;
یا
object ob1=21; 

در هر دو مثال بالا عمل Boxing اتفاق می افتد.
متغیر i که ار نوع integer است دارای مقدار 24 میباشد که در حافظه stack ذخیره شده است و در خط بعد این متغیر به یک object کپی شده است. یعنی آبجکت ob هم اکنون به یک مقدار integer اشاره میکند و هر دو متغیر شامل عدد 24 و به صورت مستقل از هم هستند و تغییر در یکی بر روی دیگری اثری نمیگذارد.
عمل Boxing در سی شارپ حافظه و زمان زیادی را مصرف میکند بدلیل اینکه به آبجکتی که به یک value type اشاره میکند باید مقدار حافظه ای در heap اختصاص داده شود و در مرحله بعد یک کپی از مقدار متغیر value type که در حافظه stack میباشد به حافظه ی heap اختصاص داده شده آن آبجکت، منتقل شود.

عمل unBoxing برعکس Boxing میباشد یعنی زمانی که یک متغیر از نو reference type (آبجکت) را سعی میکنید به یک متغیر از نوع value type تبدیل کنید.
در unBoxing مقدار متغیر reference type از حافظه heap به محل اختصاص داده شده متغیر value type در حافظه stack منتقل میشود . برخلاف عمل Boxing در unBoxing بایستی به صورت صریح این عمل casting را ذکر کنید.مثال :
int i = 24;
object ob = i; //Boxing
int j = (int) ob;//unBoxing

مقدرا اختصاص داده شده به متغییر ob از نوع integer باید دوباره به همان نوع (integer) به صورت صریح cast شود.
در واقع عملیات Boxing به صورت implicit و عملیات unBoxing به صورت explicit انجام میشود.
عملیات unBoxing نیز همانند Boxing حافظه و زمان زیادی مصرف میکند.

@fullStackDevs
2025/07/10 08:16:14
Back to Top
HTML Embed Code: