<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Arash Abbasi</title><link>https://virgool.ir/feed/@araash.abs</link><description>توسعه دهنده نرم افزار ، مشتاق و آماده یادگیری مطالب جدید در حوزه های مرتبط</description><language>fa</language><pubDate>2026-11-11 12:49:25</pubDate><image><url>https://files.virgool.ir/upload/users/197933/avatar/6zCiAc.jpeg</url><title>Arash Abbasi</title><link>https://virgool.ir/@araash.abs</link></image><item><title>انتخاب ستون های دلخواه در Entity Framework Core</title><link>https://virgool.ir/@araash.abs/انتخاب-ستون-های-دلخواه-در-entity-framework-core-eejdagqy3gst</link><description>در این پست قصد دارم تابعی را معرفی کنم که با کمک اون می توانیم ستونهای دلخواه را از جدول دیتابیس به کمک Entity Framework Core انتخاب کنیم.ما معمولا برای فیلتر کردن و استفاده از Where  در EF مشکلی نداشتیم و می توانستیم به ازای هر تعداد ورودی ای که دریافت میکردیم شرطی را به کوئری اضافه کنیم. به شکل زیر: اما ما در EF متد یا تابعی را نداریم که با استفاده از آن ستونهای دلخواه مان را فیلتر کنیم و فقط آن ستون ها را از دیتابیس انتخاب کنیم.برای مثال فرض کنید که ما یک جدولی داریم که 20 ستون دارد و از ما سرویسی خواسته شده که قابلیت دانلود اطلاعات این جدول را در خروجی اکسل از طریق اپلیکیشن ایجاد کنیم. اگر کاربر بخواهد که فقط ستونهایی که نیاز دارد را در خروجی اکسل خود ببیند یک روش این است که کلا استفاده از EF را کنار بگذاریم و به ازای نام ستون هایی که از کاربر دریافت میکنیم Raw SQL بنویسیم و به تعداد ستونهای انتخاب شده آنها را اضافه کنیم.اما روش دوم و بهتر استفاده از تابعی است که در این پست قصد معرفی کردنش را دارم که به کمک ویژگی های Linq و Lambda Expression پیاده سازی شده است. این تابع کاملا Case insensitive است و درصورتیکه نام پراپرتی موردنظر درست باشد آنرا انتخاب میکند و درغیر این صورت خطا برمیگرداند.متد موردنظرو به طریق زیر استفاده میشود:روش استفاده از متدپس از اجرای این تابع اگر کوئری ساخته شده توسط EF Core را همانطور که در کنسول این پروژه چاپ کرده ام (یا از طریق SQL Profiler) مشاهده کنید متوجه میشوید که فقط ستونهای خواسته شده در Select statement جنریت شده است.درخواست ورودیکوئری جنریت شدهمپ شدن ستونهای خواسته شده به مدل و خروجی نهاییلینک پروژهپایان</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Fri, 08 Jul 2022 23:21:18 +0430</pubDate></item><item><title>ویژگی های جدید LinQ در 6 NET.</title><link>https://virgool.ir/@araash.abs/linq-dotnet6-wzwkdusfowmp</link><description>هنگامی که .NET Framework 3.5 در سال 2007 منتشر شد، دارای ویژگی جدیدی به نام Language Integrated Query یا به اختصار LINQ بود. LINQ به توسعه دهندگان دات نت اجازه می دهد تا با استفاده از arrow function ها، کدهای سی شارپ کارآمدی را بنویسند تا لیست ها یا حتی پایگاه داده ها را با استفاده از کتابخانه هایی مانند Entity Framework Core جستجو کنند.مانند همه فیچرهای دات نت، LINQ در طول زمان به تکامل خود ادامه می دهد. نسخه آتی NET 6 تعدادی ویژگی واقعا جالب را به همراه دارد، از جمله مجموعه ای از قابلیت های جدید LINQ.در این مقاله نگاهی اجمالی به پیشرفت‌های اصلی LINQ خواهیم داشت که به زودی برای توسعه‌دهندگان .NET با NET 6 ارائه می‌شوند.برای استفاده از این API های جدید LINQ ، باید در پیش نمایش 6 یا بالاتر باشید. انتشار کامل دات نت 6 در اواخر سال 2021 اتفاق می افتد، اما اگر می خواهید قبل از این با این ویژگی ها بیشتر آشنا شوید، می توانید پیش نمایش رسمی را از مایکروسافت دانلود کنید.افزونه Chunking:افزونه Chunking احتمالاً بزرگ‌ترین افزونه به LINQ در NET 6 است. اگر شما هم قبلاً مجبور شده‌اید با مجموعه‌های بزرگی از اشیاء کار کنید و نیاز داشتید که آن مجموعه را تکه تکه کنید ، مجبور بودید که از حلقه‌ها و منطق شرطی استفاده می‌کردید:List&lt;List&lt;Movie&gt;&gt; pages = new List&lt;List&lt;Movie&gt;&gt;();&#xA;&#xA;const int PAGE_SIZE = 5;&#xA;&#xA;List&lt;Movie&gt; currentPage = null;&#xA;int spaceRemaining = 0;&#xA;&#xA;foreach (Movie movie in movies) {&#xA;    // Check to see if we&#39;re at the start of a new page&#xA;    if (spaceRemaining &lt;= 0) {&#xA;        // Move to a new page and add it to our list&#xA;        currentPage = new List&lt;Movie&gt;();&#xA;        pages.Add(currentPage);&#xA;        spaceRemaining = PAGE_SIZE;&#xA;    }&#xA;&#xA;    // Add items to the current page and decrease the count allowable in this page&#xA;    currentPage.Add(movie);&#xA;    spaceRemaining--;&#xA;}مسلماً این کد برای مفهوم ساده تقسیم یک مجموعه بزرگ به چند تکه کوچک بسیار زیاد است. علاوه بر تعداد خطوط زیاد، کد قطعه‌ کننده نیاز به آزمایش خاصی داشت تا اطمینان حاصل شود که همه موارد در یک قطعه گنجانده شده‌اند، حتی اگر آخرین تکه به‌طور کامل پر نشده باشد.خوشبختانه، در NET 6 LINQ اکنون همه اینها را در یک خط کد #C از طریق روش Chunk خود پشتیبانی می کند.const int PAGE_SIZE = 5;&#xA;&#xA;IEnumerable&lt;Movie[]&gt; chunks = movies.Chunk(PAGE_SIZE);پشتیبانی از Index در ElementAt:ویژگی بعدی ساده تر، اما بسیار کاربردی است. قبلاً، اگر می‌خواستید از انتهای یک مجموعه چیزی را به دست آورید، باید طول مجموعه را محاسبه می‌کردید و سپس آن مورد را با آن شاخص خارج می‌کردید و در صورت نیاز از آن کم می‌کردید به صورت زیر:Movie lastMovie = movies.ElementAt(movies.Count() - 1);اما به کمک ویژگی جدید دات نت 6 میتوانیم کد بالا را به صورت زیر بهینه کنیم:Movie lastMovie = movies.ElementAt(^1); پشتیبانی از Range در تابع Take:برای مثال برای پیاده سازی pagination به کمک EFCore و Linq کدی که قبلا می نوشتیم به این صورت بود:var movies = DatabaseContext.Movies.Skip(6).Take(10).ToList();اما به کمک این افزونه جدید ما میتوانیم تابع Skip رو از کد بالا حذف کنیم و به این شکل کد را بهینه کنیم:var movies = DatabaseContext.Movies.Take(6..10).ToList();این کد بسیار ساده تر است کالکشن ما تا عنصر ششم رد می شود و سپس 4 مقدار را برمیگرداند، این افزونه به طور قابل توجهی توانایی شما را برای گرفتن عناصر از مجموعه ها توسط شاخص های خاص افزایش می دهد.اضافه شدن یک overload به تابع Zip جهت پشتیبانی از سه پارامتر:پیش از این ،اگر نیاز داشتیم تا بین دو مجموعه به طور موازی iterate کنیم از تابع Zip استفاده میکردیم به صورت زیر:string[] titles = { &#34;A Tale of Two Variables&#34;, &#34;The Heisenbug&#34;, &#34;Pride, &#xA;                                             prejudice, and semicolons&#34; };&#xA;string[] genres = { &#34;Drama&#34;, &#34;Horror&#34;, &#34;Romance&#34; };&#xA;&#xA;foreach ((string title, string genre) in titles.Zip(genres)) &#xA;{&#xA;    Console.WriteLine($&#34;{title} is a {genre} film&#34;);&#xA;}این روش بسیار خوبی بود و باعث میشد که نیاز به ساخت آبجکت های بیشتری برای این منظور نداشته باشیم.با این حال ، مواردی وجود دارد که ممکن است بخواهیم بر روی سه مجموعه iterate کنیم.برای رفع این نیاز ، LINQ یک overload جدیدی برای تابع Zip پیاده سازی کرده که می توانیم به استفاده از آن به هدف خود برسیم:string[] titles = { &#34;A Tale of Two Variables&#34;, &#34;The Heisenbug&#34;, &#34;Pride, &#xA;                                            prejudice, and semicolons&#34; };&#xA;string[] genres = { &#34;Drama&#34;, &#34;Horror&#34;, &#34;Romance&#34; };&#xA;float[] ratings = { 5f, 3.5f, 4.5f };&#xA;&#xA;foreach ((string title, string genre, float rating) in titles.Zip(genres, ratings)) &#xA;{&#xA;    Console.WriteLine($&#34;{title} is a {genre} film that got a rating of &#xA;                                                            {rating}&#34;);&#xA;}پارامترهای پیش فرض برای توابع پراستفاده:متدهای LINQ همیشه و در حال حاضر FirstOrDefault ، SingleOrDefault و LastOrDefault یک پایه اصلی در توسعه LINQ در #C هستند.به بیان ساده ، این روش ها به مجموعه ای نگاه می کنند و در صورت برآورده شدن شرط ، مقدار را برمی گردانند. اگر شرطی برآورده نشده باشد ، مقدار پیش فرض برای آن نوع استفاده می شود. برای انواع ریفرنس تایپ ها که null خواهد بود ، برای انواع عددی  0 و برای boolean مقدار false برمیگردد.به عنوان مثال ، فرض کنید ما سعی کردیم اولین فیلمی را که این نویسنده را در گروه بازیگرانش داشت ، پیدا کنیم:Movie movie = movies.FirstOrDefault(m =&gt; m.Cast.Includes(&#34;Matt Eland&#34;));از آنجایی که من هرگز در فیلمی حضور نداشتم ، FirstOrDefault با مقدار پیش فرض خود کار می کرد و مقدار فیلم بر روی null ست میشد.با این حال ، در NET 6 ، LINQ اکنون به شما امکان می دهد مقدار پیشفرض خود را تعیین کنید تا در صورت عدم تطابق با شرایط مورد استفاده قرار گیرد. با این کار از مقابله با مقادیر null جلوگیری می شود و در عوض جایگزین ایمن آن را را مشخص می کند :Movie defaultValue = movies.First();&#xA;&#xA;Movie movie = movies.FirstOrDefault(m =&gt; m.Cast.Includes(&#34;Matt Eland&#34;), defaultValue);&#xA;&#xA;var numbers = new List&lt;int&gt;() { 7, 1, 9, 41, 8, 22 }; &#xA;var matchingNumber = numbers.FirstOrDefault(x =&gt; x &gt; 50, -1); //-1 &#xA;var matchingNumber = numbers.SingleOrDefault(x =&gt; X &gt; 30, -1); //41بدین شکل اگر مقداری در شرط وجود نداشت به جای null مقدار defaultValue ای که ست کردیم برگشت داده میشود.مشابه این دستور برای توابع SingleOrDefault ، LastOrDefault نیز ارائه شده است.اجتناب از شمارش با تابع TryGetEnumeratedCount:هنگام کار با LINQ ، همیشه با لیست ها و یا مجموعه هایی سر و کار نداریم که بتوانیم به سادگی طول آنها را بدست آوریم. در حقیقت ، هنگام کار با انواع خاصی از مجموعه ها ، مانند مجموعه هایی از جنس IQueryable  ، حتی یک عملیات ساده مانند فراخوانی تابع Count ممکن است باعث شود کل کوئری مورد شمارش مجدد قرار گیرد.برای حل این مشکل ، دات نت 6 متد بسیار تخصصی TryGetNonEnumeratedCount را ارائه داده است. این متد بررسی می کند که آیا تعیین تعداد موارد موجود در مجموعه باعث شمارش مجموعه می شود یا خیر. در غیر این صورت ، مقدار شمارش شده در یک پارامتر out تولید و ذخیره می شود و مقدار true از متد بر می گردد. اگر متد شمارش، باعث شمارش مجموعه شود ، متد به جای آن false ، و پارامتر out مقدار 0 را برمیگرداند.if (movies.TryGetNonEnumeratedCount(out int count))&#xA;{&#xA;    Console.WriteLine($&#34;The count is {count}&#34;);&#xA;}&#xA;else&#xA;{&#xA;    Console.WriteLine(&#34;Could not get a count of movies without enumerating &#xA;                       the collection&#34;);&#xA;}اگر این کد کمی گیج کننده بنظر میرسد ، این یک الگوی بسیار شبیه به نحوه کارکرد int.TryParse و دیگر API های TryX است که در حال حاضر در کتابخانه کلاس پایه .NET کار می کنند. تنها تفاوت این است که TryGetNonEnumeratedCount بر اجتناب از عملیات به طور بالقوه آهسته به دلیل شمارش مجموعه ای بسیار بزرگ یا کوئری زدن مجدد از پایگاه داده متمرکز شده است.توابع MaxBy و MinBy:در نهایت ، .NET 6 به توسعه دهندگان .NET اکستنشن متدهای MinBy و MaxBy را ارائه می دهد. این دو متد به شما امکان می دهد مجموعه خود را بررسی کرده و بر اساس شرطی که به آن می دهید ، بزرگترین یا کوچکترین چیزی را پیدا کند.قبل از .NET 6 برای بدست آوردن کوچکترین و یا بزرگترین مقدار یک کالکشن، باید از Max یا Min برای پیدا کردن مقدار استفاده کنید ، سپس مجدداً برای دریافت آبجکت موردنظر کوئری دیگری با استفاده از مقدار بدست آمده اجرا میکردیم:int numBattles = movies.Max(m =&gt; m.NumSpaceBattles);&#xA;&#xA;Movie mostAction = movies.First(m =&gt; m.NumSpaceBattles == numBattles);روش فوق نیاز ما را برطرف میکرد اما بهینه نبود و برای یک کار، ما دوبار به دیتابیس درخواست ارسال میکردیمدر دات نت 6 دوخط دستور بالا به یک خط زیر خلاصه شده و برای دریافت آبجکت موردنظرمان فقط یک درخواست به سمت دیتابیس ارسال میشود.Movie mostAction = movies.MaxBy(m =&gt; m.NumSpaceBattles);پایان</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Sat, 23 Oct 2021 15:04:26 +0330</pubDate></item><item><title>مقایسه معماری Rest vs gRPC</title><link>https://virgool.ir/@araash.abs/مقایسه-معماری-rest-vs-grpc-wdsfwop6amcr</link><description>مقایسه معماری Rest vs gRPCمشتاق هستید بدانید آیا gRPC تکنولوژی آینده است یا خیر؟ این مقاله قصد دارد دو سبک معماری API را توضیح دهد: REST و gRPC. قبل از اینکه به تفاوت های آنها بپردازیم ، ابتدا توضیح می دهیم که API چیست و چرا برای زیرساخت های مایکروسرویس ها ضروری است. پس از آن ، ما توضیح می دهیم که چگونه RPC اساس gRPC است و جنبه های مهم تمایز بین API های gRPC و REST را در نظر می گیریم. با توجه به مقایسه آنها ، ما در نهایت زمان استفاده از یک نوع معماری یا نوع دیگر را تجزیه و تحلیل خواهیم کرد.تعریف API:کلمه API مخفف Application Programming Interfaces است. این رابط ها به عنوان یک واسطه نرم افزاری عمل می کنند که قوانین خاصی را برای برنامه های کاربردی و تعامل با یکدیگر ایجاد می کند. یک API مسئول ارسال پاسخ از یک کاربر به یک سیستم است که به نوبه خود از سیستم به کاربر ارسال می شود.طریقه کارکرد APIتصور کنید ما در حال رزرو هتل هستیم. ما روی صفحه رزرو هتل می رویم و آن صفحه داده ها (درخواست ما) را به سروری ارسال می کند. سرور داده ها را بازیابی می کند ، آنها را تفسیر می کند ، و پس از انجام اقدامات مورد نیاز ، پاسخی را با اطلاعات موجود در رابط کاربری برای ما ارسال می کند. این فرایند به لطف API ها اتفاق می افتد.یک API انواع درخواست هایی را که یک برنامه (صفحه وب یا برنامه تلفن همراه) می تواند به دیگری بدهد ، مشخص می کند و در ادامه توضیح می دهد: چگونه این درخواست ها را انجام دهیم. کدام فرمت های داده را استفاده کنید و شیوه هایی که کاربران باید رعایت کنند.در این مقاله قصد داریم دو معماری معروف gRPC (Google Remote Procedure Call) و REST (Representational State Transfer) را با هم مقایسه کنیم.کاربرد API در مایکروسرویس ها:از یک سو ، در یک برنامه یکپارچه ، همه ویژگی های پروژه در یک واحد ، به طور دقیق تر ، در یک پایگاه کد واحد گنجانده شده است. از سوی دیگر ، معماری مایکروسرویس شامل چندین سرویس کوچکتر است که با یکدیگر از طریق پروتکل هایی مانند HTTP ارتباط برقرار می کنند. سرویس های کوچکتر که بخشی از معماری مایکروسرویس هستند از طریق API ها با یکدیگر ارتباط برقرار کرده و با یکدیگر تعامل دارند. به عبارت دیگر ، API ها به همه سرویس هایی که در یک برنامه مایکروسرویس ادغام شده اند امکان اتصال و ارتباط می دهند.پرکاربردترین سبک معماری REST API است. با این حال ، هنگام ایجاد API سه مدل اصلی وجود دارد: RPC (فراخوانی از راه دور) ، REST (Representational State Transfer) و GraphQL. در این مقاله ، ما روی دو مورد اول تمرکز می کنیم.فراخوانی از راه دور یا RPC چیست؟تکنولوژی RPC از مدل client-server استفاده می کند. سرور درخواست کننده (به عبارت دیگر کلاینت) پیامی را درخواست می کند که توسط RPC ترجمه شده و به سرور دیگری ارسال می شود. هنگامی که سرور درخواست را دریافت می کند ، پاسخ را به مشتری ارسال می کند. در حالی که سرور در حال پردازش این درخواست است ، سرویس گیرنده مسدود شده و پیام داخلی که در سرورها ارسال می شود پنهان است.علاوه بر این ، RPC به مشتری اجازه می دهد تا عملکردی را در قالب خاصی درخواست کند و پاسخ را در همان قالب دریافت کند. با این وجود ، روش ارسال درخواست با RPC API در URL یافت می شود. RPC از فراخوانی های از راه دور در محیط های محلی و توزیع شده پشتیبانی می کند.تکنولوژی REST چیست؟هنگام استفاده از REST API ها ، پاسخ داده های بک اند از طریق قالب JSON یا XML به  کاربران منتقل می شود. این مدل معماری از پروتکل HTTP پیروی می کند. با این حال ، غیر معمول نیست که طرح های RPC ضمن حفظ مدل RPC ، چند ایده از HTTP انتخاب کنند. در حقیقت ، اکثر API های مدرن با نگاشتن API ها به همان پروتکل HTTP ، علیرغم مدل مورد استفاده (RPC یا REST) پیاده سازی می شوند.هنگامی که REST API به صورت عمومی در دسترس است ، هر سرویسی که از مایکروسرویس استفاده می کند می تواند به عنوان منبعی به کاربر ارائه شود که از طریق دستورات HTTP زیر قابل دسترسی است: GET ، DELETE ، POST و PUT.تکنولوژی gRPC چیست؟تکنولوژی gRPC مخفف عبارت Google Remote Procedure Call و یک نوع مبتنی بر معماری RCP است. این فناوری پیاده سازی RPC API را دنبال می کند که از پروتکل HTTP 2.0 استفاده می کند ، اما HTTP نه به توسعه دهنده API و نه به سرور ارائه نمی شود. بنابراین ، نیازی به نگرانی در مورد چگونگی ترسیم مفاهیم RPC در HTTP نیست ، که از پیچیدگی آن می کاهد.به طور کلی ، هدف gRPC این است که انتقال داده ها بین مایکروسرویس ها را سریعتر انجام دهد. این بر اساس رویکرد تعیین سرویس ها، ایجاد روشها و پارامترهای مربوطه برای فعال کردن انواع فراخوانی از راه دور و دریافت پاسخ است.علاوه بر این ، مدل API RPC را در IDL (زبان توصیف رابط) بیان می کند ، که برای تعیین روشهای از راه دور سریعتر ارائه می دهد. به طور پیش فرض ، IDL از پروتکل بافر (اما جایگزین های دیگر نیز موجود است) برای توصیف رابط سرویس و همچنین ساختار پیام های ارسالی استفاده می کند.تفاوت gRPC و REST:اکنون که مروری کلی بر gRPC و REST داریم ، اجازه دهید تفاوت های اصلی آنها را بررسی کنیم.HTTP 1.1 vs HTTP 2:سرویس های REST از یک مدل درخواست و پاسخ ارتباطی استفاده می کنند که معمولاً بر روی HTTP 1.1 ساخته شده است. متأسفانه ، این بدان معناست که اگر یک مایکروسرویس درخواست های متعددی از چندین سرویس گیرنده دریافت کند ، مدل باید به هر درخواست در یک زمان رسیدگی کند ، در نتیجه کل سیستم را کند می کند. با این حال ، API های REST نیز می توانند بر روی HTTP 2 ساخته شوند ، اما مدل ارتباطی درخواست و پاسخ یکسان است ، که API های REST را از حداکثر استفاده از مزایای HTTP 2 ، مانند ارتباطات جاری و پشتیبانی دو طرفه منع می کند.اما gRPC با مانع مشابهی روبرو نیست. این تکنولوژی برپایه HTTP2 ساخته شده است و در عوض از مدل ارتباطی client-response پیروی می کند. این شرایط به دلیل توانایی gRPC در دریافت درخواست های متعدد از چندین کلاینت و مدیریت همزمان این درخواست ها با جریان دادن مداوم اطلاعات ، از ارتباطات دو طرفه و ارتباطات streaming پشتیبانی می کند. به علاوه ، gRPC همچنین می تواند تعاملات &#34;غیرمتعارف&#34; مانند تعاملات ایجاد شده بر روی HTTP 1.1 را انجام دهد.در مجموع ، gRPC قادر است تعاملات غیرمتعارف و انواع مختلف streaming را مدیریت کند:غیرمتعارف یا Unary: زمانی که کلاینت یک درخواست ارسال میکند و یک پاسخ دریافت میکند.استریم سرور Server-streaming: هنگامی که سرور با یک استریم پیام، به درخواست کلاینت پاسخ می دهد. زمانی که همه داده ها ارسال می شوند ، سرور علاوه بر این یک پیام وضعیت را برای تکمیل فرآیند ارسال می کند.استریم کلاینت Client-streaming: هنگامی که کلاینت یک استریم از پیام ها را ارسال می کند و یک پاسخ واحد از سرور دریافت می کند.استریم دوطرفه Bidirectional-streaming: دو استریم (سرویس گیرنده و سرور) مستقل هستند ، به این معنی که هر دو می توانند پیام ها را به هر ترتیبی منتقل کنند. سرویس گیرنده کسی است که جریان دو طرفه را آغاز و پایان می دهد.استریمینگ های مختلفBrowser Support:این جنبه احتمالاً یکی از مزایای اصلی REST نسبت به gRPC است. از یک طرف ، REST به طور کامل توسط همه مرورگرها پشتیبانی می شود. از سوی دیگر ، وقتی از پشتیبانی مرورگر صحبت می شود ، gRPC هنوز کاملاً محدود است. متأسفانه ، برای انجام تبدیل بین HTTP 1.1 و HTTP 2 به gRPC-web و یک لایه پروکسی نیاز است. بنابراین ، gRPC عمدتا برای سیستم های داخلی/خصوصی مورد استفاده قرار می گیرد.Payload Data Structure:همانطور که قبلاً ذکر شد ، gRPC به طور پیش فرض از Protocol Buffer برای سریالایز کردن داده ها استفاده می کند. این راه حل سبک تر است زیرا فرمت بسیار فشرده را فعال می کند و اندازه پیام ها را کاهش می دهد. علاوه بر این ، Protobuf (یا پروتکل بافر) باینری است. بنابراین ،داده های ساختار یافته را به منظور برقراری ارتباط و انتقال آنها ، سریالایز و دیسریالایز می کند. به عبارت دیگر ، پیامهای strongly-typed می توانند به طور خودکار از Protobuf به زبان برنامه نویسی سرویس گیرنده و سرور تبدیل شوند.در مقابل ، REST عمدتا به فرمت های JSON یا XML برای ارسال و دریافت داده ها متکی است. در حقیقت ، JSON با وجود اینکه هیچ ساختاری را اجباری نمی کند ، به دلیل انعطاف پذیری و قابلیت ارسال داده های پویا بدون لزوم پیروی از یک ساختار دقیق ، محبوب ترین فرمت است. یکی دیگر از مزایای مهم استفاده از JSON سطح خوانایی آن از نظر انسانی است که Protobuf هنوز نمی تواند با آن رقابت کند.با این وجود ، JSON هنگام انتقال داده ها ، سبک و سریع نیست. دلیل آن در این واقعیت نهفته است که هنگام استفاده از REST ، JSON (یا سایر فرمت ها) باید سریالایز شود و به زبان برنامه نویسی مورد استفاده در طرف مشتری و سرور تبدیل شود. این یک مرحله اضافی به روند انتقال داده ها می افزاید که در نتیجه می تواند به عملکرد آسیب برساند و احتمال خطاها را باز کند.Code Generation Features:برخلاف REST API ، gRPC ویژگی های تولید کد را ارائه نمی دهد ، به این معنی که توسعه دهندگان باید از یک ابزار third-party مانند Swagger یا Postman برای تولید کد برای درخواست های API استفاده کنند.در مقابل ، gRPC به دلیل کامپایلر protoc دارای ویژگی های تولید کد native است که با چندین زبان برنامه نویسی سازگار است. این امر به ویژه برای سیستم های مایکروسرویس که خدمات مختلفی را که در زبان ها و سیستم عامل های مختلف توسعه یافته است ، ادغام می کند مفید است.تفاوت های gRPC و RESTچه زمانی از REST و gRPC استفاده کنیم؟همانطور که گفته شد ، علی رغم مزایای بسیار زیادی که gRPC ارائه می دهد ، یک مانع عمده دارد: سازگاری کم مرورگر. در نتیجه ، gRPC کمی محدود به سیستم های داخلی/خصوصی است.برعکس ، REST API ها ممکن است معایب خود را داشته باشند ، همانطور که گفتیم ، اما آنها شناخته شده ترین API ها برای اتصال سیستم های مبتنی بر مایکروسرویس ها هستند. بعلاوه ، REST از استانداردسازی پروتکل HTTP پیروی می کند و پشتیبانی جهانی را ارائه می دهد و این سبک معماری API را به گزینه ای برتر برای توسعه خدمات وب و همچنین ادغام برنامه ها و مایکروسرویس ها تبدیل می کند. با این حال ، این بدان معنا نیست که ما باید از تکنولوژی gRPC غافل شویم.سبک معماری gRPC دارای ویژگی های امیدوارکننده ای است که می توان (و باید) آنها را یاد گرفت و توسعه داد. این تکنولوژی یک گزینه عالی برای کار با سیستم های چند زبانه ، real-time streaming و به عنوان مثال ، هنگام کار با یک سیستم اینترنت اشیاء است که نیاز به ارسال پیامهای سبک وزن دارد ، مانند پیامهای سری شده Protobuf. علاوه بر این ، gRPC همچنین باید برای برنامه های تلفن همراه در نظر گرفته شود زیرا آنها نیازی به مرورگر ندارند و می توانند از پیامهای کوچکتر بهره مند شوند و سرعت پردازنده های تلفن همراه را حفظ کنند.نتیجه گیری:تکنولوژی gRPC مزایای زیادی را ارائه می دهد. برخلاف REST ، می تواند با استفاده از جریان های چندگانه و پیروی از پروتکل باینری ، حداکثر استفاده را از HTTP 2 بکند. بعلاوه ، به دلیل ساختار پیام Protobuf ، مزایای عملکردی را ارائه می دهد ، و ویژگی های تولید کد داخلی که محیطی چند زبانه فعال می کند را فراموش نکنیم. این دلایل gRPC را به یک سبک معماری API امیدوار کننده تبدیل می کند.با این وجود ، پشتیبانی کم مرورگر رقابت با پشتیبانی جهانی REST را دشوار می کند. REST به عنوان تکنولوژی ماندگاری در سیستم های مایکروسروییس باقی می ماند و محبوب ترین راه حل است. بنابراین ، بسیار محتمل است که این جایگاه را برای مدت طولانی داشته باشد.</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Thu, 19 Aug 2021 15:46:19 +0430</pubDate></item><item><title>سوالات متداول مصاحبه شغلی دات نت</title><link>https://virgool.ir/applymag/سوالات-متداول-مصاحبه-شغلی-دات-نت-o1fnevrq5pmx</link><description>سوالات متداول مصاحبه شغلی دات نت1. اصول شی گرایی؟Abstraction:مخفی کردن پیاده سازی ها می باشد .ما به کمک کلاس های abstract و یا اینترفیس ها ، کلاس های برنامه را از تعاریف جدا میکنیم. انتزاع داده یا پنهان کردن اطلاعات، Abstraction نامیده می شود. به عبارت دیگر فرآیندی برای انتزاع یا پنهان سازی عملکردها می باشد و فقط امکان استفاده از آن ها را برای کاربران یا برنامه نویسان فراهم می کند. برای مثال متدConsole.WriteLine. هیچ کس نمی داند چه عملیاتی در تابع اتفاق می افتد و ما فقط با صدا زدن و ارسال پارامتر از آن استفاده می کنیم.Encapsulation:محدود کردن دسترسی به اعضای یک کلاس می باشد . به کمک access modifier ها.Polymorphism:یا چند ریختی به این معنی است : Method overloading , Method overriding , Method hidingبه معنای چند ریختی است و به دو صورت قابل پیاده سازی است.Static (Compile Time Polymorphism)به معنی Overloading می باشد. می توانیم چندین متد با یک نام ایجاد کنیم اگرچه پارامترها متفاوت هستند.Dynamic (Runtime Polymorphism)از این نوع برای مفاهیم بازنویسی (Overridden) استفاده می شود. با استفاده از کلمات کلیدی Virtualو Overrideپیاده سازی می شود.Inheritance:وراثت، اشیاء جدید را قادر می سازد تا از ویژگیهای اشیاء موجود استفاده کنند. برای ایجاد آن به یک ساختار سلسله مراتبی نیاز داریم که به وسیله OOP و با استفاده از Inheritance فراهم می شود. کلاس فرزند خاصیت ها و متدهایی که در کلاس پدر عمومی هستند را به ارث می برد. از مزایای آن قابلیت استفاده مجدد و توسعه پذیری کد ها را میتوانیم نام ببریم.2.آبجکت چیست؟بلوک هایی از حافظه می باشد که بر اساس خواست و کلاس هایی که ما تعریف میکنیم شکل دهی می شوند.کلاس ها به خودی خود کاربردی ندارند و برای استفاده از آنها ما باید آبجکت و یا نمونه ای از آنها را در حافظه بسازیم تا بتوانیم از قابلیت آنها استفاده کنیم.3.کدهای managed و unmanaged چیست؟کد هایی که به زبان میانی دات نت و یا IL(intermediate language) ابتدا کامپایل شوند و بعد از آن به زبان ماشین ترجمه شوند کدهای managed گفته میشوندو کدهایی که بصورت مستقیم به زبان ماشین ترجمه می شوند کدهای unmanaged گفته میشوند.4.مفهوم boxing و unboxing چیست؟Boxing: به زبان ساده وقتی ما یک متغیر Value Type را به یک Reference Type نسبت بدیم عملیات باکسینگ انجام شده است.int stackVar = 12;object boxedVar = stackVar;Unboxing: زمانی که ما یک ReferenceType را که در Heap قرار دارد را معادل یک متغیر در Stack میکنیم .Int unboxed = (int)boxedVar;اضافه کردن یک آیتم ValueType به یک آرایه از مثال های دیگر باکسینگ می باشد.و زمانی که آن آیتم را از آرایه به یک ValueType تبدیل میکنیم آنباکسینگ کرده ایم.5.تفاوت struct با class چیست؟رفرنس struct : System.Value و رفرنس کلاس: System.Objectدر استراکت ها حالت abstract وجود ندارد درصورتی که در کلاس ها وجود داردکاربرد استراکت ها در دیتاهای کم تعداد می باشد به دلیل اینکه استراکت ها ValueType هستند ولی کلاس ها در دیتا های با حجم بالا کاربرد دارند.در استراکت ها ارث بری وجود ندارد درصورتیکه کلاس ها این قابلیت را دارندکلاس ها برای استفاده نیازمند ساخت آبجکت هستند درصورتیکه استراکت ها اینطور نمی باشند.استراکت ها تابع سازنده ندارند در صورتیکه کلاس ها این قابلیت را دارا می باشند.6.کلاس abstract چیست؟به طور کلی، Abstract کلاسی می باشد که غیر قطعی و ناتمام است که باید در سطح فرزندانش تکمیل شود. کلاس Abstractشبیه اینترفیس می باشد ولی با دیدی وسیع تر. این کلاسها می‌تواند دارای متدهای Abstract باشند که شبیه اینترفیس فقط اعلام می شوند و باید در کلاسهای مشتق شده بازنویسی شوند. علاوه بر این، میتوان در این کلاسها متدهایی داشت که Abstractنیستند و احتیاجی به پیاده سازی آنها در کلاس های مشتق شده ندارند. تنها متدهایی از کلاس abstractالزام به پیاده سازی دارند که صریحا کلمه‌ abstractدر تعریف آن متد ذکر شده باشد. این امکان نیز وجود دارد که متدهای abstract در subclassهم به صورت abstractذکر شوند. البته به شرطی که subclassهم به صورت abstractتعریف شده باشد.تعریف سطوح دسترسی برای متدها و خصوصیت‌ها مانند کلاسهای معمولی نیز از مزیت‌های این کلاس‌ها می باشد.7.مفهوم interface چیست؟به طور کلی اینترفیس ها یک قالب اجرائی برای کلاس ها هستند. بدین صورت که با تعریف مشخصات کلی متدها، بدون پیاده سازی آنها، کلاسهای مشتق شده را ملزم به پیاده سازی کامل آن متدها می کند. بنابراین فقط مشخصات متدها یک بار در اینترفیس تعریف می‌شوند و هر جا که لازم باشد پس از ارث بری، متدهای آنها پیاده سازی می‌شوند. علاوه بر اینکه متدهای اینترفیس‌ دارای بدنه نمی باشند، اینترفیس‌ها سازنده و فیلد ندارند و نمی‌شود از روی آنها نمونه‌ای ایجاد کرد.در حالت عادی ارث بری از چند کلاس به طور هم زمان امکان پذیر نیست ولی اینترفیس ها این مزیت را دارند که به هر تعداد که لازم است، کلاسهای مشتق شده از آنها ارث بری کنند. این موضوع یکی از مهم‌ترین مزایای اینترفیس می‌باشد. هم چنین با استفاده از اینترفیس ها کد‌ها قابلیت بهتری در نگهداری، انعطاف پذیری و استفاده مجدد پیدا می کنند.8.تفاوت interface و abstract class چیست؟1- یک کلاس معمولی تنها می‌تواند از یک کلاس Abstractارث بری کند ولی همان کلاس می تواند از چندین اینترفیس ارث ببرد.2- یک اینترفیس فقط می تواند اعلان متدها و خصوصیت ها را داشته باشد، اما یک کلاس Abstractعلاوه بر آنها می تواند متدها و خصوصیت هایی با کدهای کامل داشته باشد.3- عناصر موجود در کلاس Abstractمی توانند مانند یک کلاس معمولی دارای سطح دسترسی باشند، ولی اینترفیس ها فاقد این امکان هستند.4- کلاس‌های Abstract مانند کلاسهای معمولی می‌توانند دارای فیلد و عناصر دیگری (مثل ثابت‌ها) باشند، در حالیکه یک اینترفیس فاقد این امکان می‌باشد. همچنین کلاس abstractمی تواند شامل سازنده باشد، اما اینترفیس نمی تواند.5- اینترفیس تنها می تواند از اینترفیس ارث بری کند اما کلاس abstractمی تواند از اینترفیس، کلاس Abstractو یا سایر کلاس‌ها ارث بری کند.9. چه زمانی از Interface ‌ها و یا کلاسهای Abstract استفاده کنیم؟1- مواقعی که نیاز به وراثت چند گانه داریم باید از اینترفیس استفاده کنیم، به دلیل اینکه این امکان در کلاس‌های Abstractوجود ندارد.2- زمانی که بخواهیم تمام متدهای معرفی شده در کلاس پایه به طور کامل در کلاس مشتق شده پیاده شوند باید از اینترفیس استفاده کنیم.3- وقتی در پروژه‌های بزرگ با تغییرات زیادی مواجه هستیم، استفاده از کلاس Abstract توصیه می‌شود، زیرا با تغییر آن به طور خودکار تغییرات در کلاس های مشتق شده اعمال می‌شوند.4- با توجه به اینکه به غیر از اعلان متدها و خصوصیت‌ها امکان تعریف عناصر دیگری در اینترفیس ها وجود ندارد، در صورتیکه ملزم به استفاده از این عناصر باشیم، استفاده از کلاسهای Abstract ضروری می‌باشد.5- در صورتی که نخواهیم کلیه متد‌ها در کلاس‌های مشتق شده پیاده سازی شوند و تعدادی از آنها را در کلاس پدر کدنویسی کنیم، باید از کلاس Abstractاستفاده کنیم.6- به طور کلی یک اینترفیس چارچوب و قابلیتهای یک کلاس را مشخص می کند و یک قرارداد است، ولی کلاس Abstractنوع کلاس را معین می‌کند. این تفاوت کمک بسیاری برای تشخیص زمان استفاده از این دو را به برنامه نویسان می دهد.10.کلید واژه های break و continueچه تفاوتی دارند؟دستور break در حلقه های تودرتو از درونی ترین حلقه ای که درآن قرار دارد خارج میشود و از خط بعدی بلاک شروع میکنددستور continue به ابتدای آخرین (درونی ترین) حلقه ای که درآن قرار دارد وارد شده و شرط آنرا تست میکند.11. تفاوت constant ها و readOnly ها چیست؟متغیر های constant در زمان تعریف باید مقداردهی شوند. اما متغیر های readOnlyمیتوانند در تابع سازنده همان کلاس مقداردهی شوند.12.کلید واژه thisچیست و آیا میتوان در متدهای استاتیک از آن استفاده کرد؟کلیدواژه this به ابجکتی اشاره میکند که در آن قرار دارد.در متد های استاتیک نمیتوانیم از this استفاده کنیم به این دلیل که this به نمونه ای از آبجکت جاری اشاره میکند، زمانی که از متد استاتیک استفاده میکنیم در واقع متدی داریم که مستقل از آبجکت میباشد بنابراین this در آن کاربردی ندارد.13.پراپرتی چیست؟یکی از ممبرهای کلاس میباشد که یک مکانیزم انعطاف پذیر برای خواندن، نوشتن و محاسبه مقادیر است که با دنیای بیرون از کلاس ارتباط برقرار میکند.14.توابع extension method چگونه ساخته میشوند؟برای ساخت آن یک کلاس استاتیک با یک متد پابلیک استاتیک میسازیم و ورودی آن متد را جنس آن کلاسی که میخواهیم برای آن extension method بنویسیم قرار میدهیم با کلیدواژه this قبل از آن.15.تفاوت string و stringBuilder چیست؟هردو مکانیزمی برای ذخیره سازی رشته ها هستند.اما string ها آبجکت های immutable هستند یعنی تغییر ناپذیرند. یعنی اگر مقدار جدیدی به آن بدهیم و یا تغییری در آن بدهیم آبجکت جدیدی ساخته میشود .اما stringBuilder ها mutable هستند.و میتوان تغییرشون داد و یا مقدار جدیدی به آنها داد و همان آبجکت تغییر میکند. بنابراین سرعت آن بیشتر است و مدیریت حافظه بهتری دارند.16.مفهوم delegate و کاربرد آن چیست ؟دلگیت ها مانند یک اشاره گر به توابع هستند و متغیری از جنس تابع هستند.یک آبجکت دلیگیت میتواند تعداد زیادی تابع را بصورت رفرنس در خودش نگهداری کند که در یک invocation list قرار دارند و ما میتوانیم به آنها اشاره کنیم. ما توسط عملگر های =+ و یا =- میتوانیم به آبجکت دلیگیت یک اشاره گر(متد) اضافه و یا کم کنیم.برای پیاده سازی event ها بسیار کاربرد دارند و رفرنس آن System.Delegate می باشد.*** دلیگیت تایپی است که اگر متغیری از آن تعریف کنیم و توابعی را در داخل آن رجیستر نماییم، در زمان فراخوانی آن متغیر دلیگیت ، توابع رجیستر شده در آن به ترتیب اجرا می­شوند.17.کلاس های Sealed چیست؟از این کلاس ها نمی توان ارث بری کرد.18.کلاس های Partial چیست؟با استفاده از این کلاس ها میتوان یک کلاس را به دو یا چند کلاس تقسیم کرد ولی همه آنها یک کلاس را تشکیل میدهند.19.اینترفیس IEnumerable چیست؟یک اینترفیس والد برای همه مجموعه های System.Collection و System.Collection.Generic میباشد.و فقط یک متد GetEnumerator() دارد.خاصیت iterate کردن روی تمامی فرزندان و آبجکت هایی که در System.Collection و System.Collection.Generic وجوددارند از این اینترفیس نشات گرفته شده است.20.معنی Early binding و Late binding را توضیح دهید؟همان مفهوم پلی مورفیسم و یا چندریختی میباشد.Early binding:همان method overloading میباشد و که در زمان کامپایل تایم رخ میدهد.Late binding: همان method overriding میباشد که در زمان ران تایم رخ میدهد.21. تفاوت بین IQueryable و IEnumerable چیست؟هردوی این اینترفیس ها برای کار با کالکشن ها میباشند. اما طرز رفتار آنها با کالکشن ها متفاوت است.اینترفیس IQueryable از System.Linq و IEnumerable از System.Collection هستند.اینترفیس IQueryableاستخراج شده ای از IEnumerable میباشد درصورتیکه خود IEnumerable والدی ندارد.اگر بخواهیم دیتایی را در حافظه و یا به اصطلاح In Memory استفاده کنیم از IEnumerable استفاده میکنیماما اگر دیتای ما خارج از حافظه قرار داشته باشد و ما بخواهیم فیلترمان به همراه کوئری به سمت آن بفرستیم از IQueryable استفاده میکنیم.بطور کلی اگر بخواهیم از Lazy loading استفاده کنیم از IQueryable استفاده میکنیم.Static void Main(string[] args)&#xA;{&#xA;            using(var db = new MyDbContext())&#xA;            {&#xA;                    IEnumarable&lt;Client&gt; clients = &#xA;                         db.Clients.Take(5).ToList();&#xA;                    IQueryable&lt;Client&gt; someClients = &#xA;                         db.Clients.Take(5).ToList();&#xA;            }&#xA;}در استفاده از IEnumerable ما تمام رکورد ها را در حافظه می اوریم و بعد انرا فیلتر کرده و 5 تا از آنها را بر می­داریم در صورتیکه در IQueryable فیلتر ما به همراه کوئری ارسال شده و دقیقا همان 5 رکوردی که نیاز داریم به حافظه انتقال داده می­شود.22.تفاوت Array , ArrayList , List ؟Array:آرایه حجم ثابتی دارد و قابل تغییر نیست درصورتیکه ArrayList قابل کوچک و بزرگ شدن است.آرایه میتواند فقط یک نوع دیتا تایپ داشته باشد درصورتیکه ArrayList میتوانند چندین دیتا تایپ یا آبجکت را در خودش ذخیره کند.آرایه از namespace ، System میباشد درصورتیکه ArrayList از System.Collection میباشد.آرایه میتواند چندبعدی باشد درصورتیکه ArrayList فقط یک بعد دارد.(ماتریس)لیست ها خیلی شبیه ArrayList ها هستند اما در List ها عناصر آنها از یک تایپ مشخص هستند.سرعت خواندن Array بیش از سایرین میباشد و در عملیات های محاسباتی بهتر است که از  Array ها استفاده شود.23.تفاوت is و as چیست؟برای مقایسه دو ابجکت از is استفاده میکنیم که مقدار Boolean برمیگرداندعملگر as خیلی شبیه is است با این تفاوت که چیزی که به ما برگردانده میشود آبجکت است در صورتیکه هردو تایپ یکسان باشند ، درغیر این صورت null برمیگرداند.24.روش های مختلف method overloading را توضیح دهید؟تعداد ورودی های متفاوت ، تایپ(جنس) ورودی های متفاوت ، ترتیب متفاوت ورودی ها25.جنریک در سی شارپ را تعریف کنید؟جنریک ها به ما این امکان را میدهند که کلاس یا متدهای جنرالی را بنویسیم به گونه ای که بتوانند با هر دیتا تایپی کارکنند.26.تفاوت ref و outچیست؟مقدار ref باید از قبل مقدار دهی شده باشند تا مورد استفاده قرار گیرند اما متغیر هایی که کلیدواژه out را دارند نیازی به مقدار دهی اولیه ندارند.پراپرتی ها نمیتوانند از این کلید واژه ها استفاده کنند . فقط فیلدها این امکان را دارند.27.الگوی Decorator:به کاربر اجازه می دهد که عملکرد جدیدی را به یک شی موجود اضافه کند بدون آنکه به تغییر در آن ساختار نیاز داشته باشد.زمانی استفاده میشود که برای یک شی ما چندین پیاده سازی داشته باشیم ، بدین منظور یک کلاس abstract ایجاد میکنیم و تابع یا توابع موردنیاز خود را در آن تعریف میکنیم.در قدم بعدی یک کلاس decorator ایجاد کرده و آنرا از کلاس abstract خود ارث بری میکنیم و در تابع سازنده آن ، شی ای از کلاس abstract خود را inject میکنیم و توابع کلاس پدر را override میکنیم.سپس هر تایپی که اضافه میشود را از کلاس decorator ای که ساختیم ارث بری کرده و تابع یا توابع آنرا بر اساس نیاز خود پیاده سازی و override می­کنیم.Decorator_Pattern_SampleCodeDecorator_Pattern28.الگوی Strategy:1.پیاده سازی الگوریتم های مختلف 2.عدم وابستگی استفاده کننده به پیاده سازی3.تاکید بر تک وظیفه ای 4.رعایت اصل OCPدر الگوی استراتژی قسمت متغیر کلاس را جدا و قسمت ثابت کلاس را هم جدا پیاده سازی میکنیم.** هرجا با if-else یا switch-case های طولانی روبرو شدیم می توان از این الگو استفاده کرد.Strategy_Pattern_SampleCodeStrategy_Pattern29.اصول Solid:Single Responsibility: تعریف صحیح آن این است که هر ماژول تنها و فقط یک دلیل برای تغییر باید داشته باشد. در حقیقت هر ماژول باید تنها و فقط به یک Actor در سیستم خدمات بدهد.Open Closed: ماژول های ما باید برای توسعه باز باشند و برای اعمال تغییر بسته باشند. باید بدون تغییرات در سورس های اصلی کلاس، به کلاس ها ویژگی اضافه کنیم. برای رعایت کردن این اصل، در زمان طراحی یک ماژول باید به این فکر کنیم کدام قسمت ها قابل تغییر است و کدام قسمت ها قابل تغییر نیست. (قسمت های متغیر را از کلاس جدا می کنیم).یکی دیگر از مطالبی که زیاد با آن سر و کار داریم، Abstraction (انتزاع) می باشد. همانطور که می دانیم Abstraction یکی از اصول شی گرایی است. سطح Abstraction یعنی در طراحی یک ماژول، بدانیم تا کجا این ماژول Abstract می باشد و سپس نمونه واقعی می شود. برای مثال در دنیای موجودات زنده، موجود زنده Abstract است، حیوان، گیاه و انسان Abstract هستند و در نهایت اسب یک نمونه واقعی می باشد و می توانیم از آن نمونه بسازیم. تعیین کردن سطح Abstraction، بسیار مهم است.Liskov Substitution: تعریف آن این است که اشیا پدر بتوانند با فرزندان جایگزین شوند و با جایگزینی عملکرد تغییری نکند.Interface Segregation: پیش از این هم گفتیم که اینترفیس‌ها فقط مشخص می‌کنند که یک کلاس از چه متدهایی حتماً باید برخوردار باشد. در همین راستا و بر اساس این قانون، چندین اینترفیس تک‌منظوره به مراتب بهتر است از یک اینترفیس چندمنظوره است به طوری که اگر یک اینترفیس چندمنظورهٔ کامل و جامع داشته باشیم و سایر کلاس‌های ما از آن اصطلاحاً implements  کنند،‌ در چنین صورتی ممکن است برخی خصوصیات، متدها و رفتارها را به برخی کلاس‌هایی که اصلاً نیازی به آن‌ها ندارند تحمیل کنیم اما اگر از چندین اینترفیس تخصصی استفاده کنیم، به سادگی می‌توانیم از هر اینترفیسی که نیاز داشته باشیم در کلاس‌های مد نظر خود استفاده نماییم و در صورتی هم کلاسی وجود داشت که نیاز به استفاده از چندین اینترفیس مختلف داشت، دست ما باز خواهد بود تا آن کلاس را از چندین اینترفیس implements  کنیم.Dependency Inversion: ماژول های سطح بالا نباید به ماژول های سطح پایین وابستگی پیدا کنند و فقط باید به Abstraction وابسته باشند.(وظیفه ساختن نیازمندیها را به خارج از کلاس منتقل کنیم).این مقاله به مرور زمان تکمیل خواهد شد ...در صورتی که ایراد تایپی و یا مفهومی ای را مشاهده کردین و یا سوالات جدیدی شنیدین که دوس دارین در این مقاله اضافه بشه خیلی خوشحال میشم که باهام درمیون بذارین تا نسبت بهش اقدام کنم.</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Sat, 14 Aug 2021 17:37:02 +0430</pubDate></item><item><title>نکاتی در مورد کار با PDF در دات نت و برترین کتابخانه های آن</title><link>https://virgool.ir/@araash.abs/نکاتی-در-مورد-کار-با-pdf-در-دات-نت-و-برترین-کتابخانه-های-آن-b1eyh3rcreux</link><description>کتابخونه های کار با pdf به دو دسته کلی تقسیم میشندسته اول کتابخونه هایی هستند که باهاشون میشه فایل های PDF رو خوند، محتواش رو Extract یا Edit کرد و یا فایل جدید ساختاز معروف ترین این کتابخونه ها میشه به ترتیب به موارد زیر اشاره کردiTextSharpiTextSharp.LGPLv2.CoreiText7PdfSharpCoreمعروف ترین شون iTextSharp  هست که فقط NET Framework Full. رو پشتیبانی میکنه اما وحید نصیری یه نسخه port شده ازش رو برای NET Core. درست کرده به نام iTextSharp.LGPLv2.Coreهمچنین کتابخونه itext7 که توسط سازنده iTextSharp توسعه داده شده و به عنوان نسخه بعدی iTextSharp و با پشتیبانی از NET Core. اون رو توسعه داده و توصیه میکنه از itext7 استفاده کنین.?دسته دوم کتابخونه هایی هستند که میتونن محتوای یه صفحه html (شامل المان ها و css ها و ...) رو به صورت PDF رندر کنن و خروجی PDF ازشون بگیرناز جمله معروف ترین این کتابخونه ها میشه به ترتیب به موارد زیر اشاره کردDinkToPdfitext7.pdfhtmlRotativa.AspNetCoreWkhtmltopdf.NetCore طرز کار همشونم به این صورته که اینا معمولا wrapper ایی بر روی کتابخانه wkhtmltopdf هستند که کارش Render کردن خروجی html به pdf هست و پشت صحنه هم از موتور Qt WebKit استفاده میکنن که یک Browser Engine اپن سورس هست.اکثر مواقع نیاز برنامه نویسا همین دسته دوم هست. معمولا میخوان از گزارشاتشون خروجی pdf بگیرن که دسته دوم گزینه راحت تری هست چرا که اینجا ما دیگه با یه صفحه  html + css  سرو کار داریم و خیلی راحت میتونیم هر فرم و جدولی رو که بخوایم طراحی کنیم و وقتی از خروجی html ایی اون مطمئن شدیم اون رو به pdf تبدیل کنیمدسته اول معمولا کاربرد خاص تری دارند. مثلا اگه بخواین فایل pdf تون رو بخونین، محتواش رو پردازش یا ویرایش کنین یا مثلا ساخت صفحاتتون رو خیلی سفارشی سازی کنین باید از کتابخونه های دسته اول استفاده کنینیه سری کتابخونه قدرتمند دیگه هم هستند مثل Aspose و Syncfusion ولی چون اونا پولی هستند و نسخه رایگانشون محدودیت داره تو لیست نیاوردمشونپایانمنبع: ِDotNetZoom</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Mon, 02 Aug 2021 17:44:28 +0430</pubDate></item><item><title>ASP.NET Core Health Check</title><link>https://virgool.ir/@araash.abs/aspnet-core-health-check-jx86txxguipt</link><description>زمانی که در حال توسعه پروژه بزرگی هستیم که ممکن است چندین API و یا سرویس را در آن استفاده کرده باشیم ،  مشاهده فوری سلامت سرویس ها و API ها کار دشواری به نظر می رسد.در این مقاله قصد دارم نحوه تنظیم کردن ASP.NET Core Health Checks و نحوه استفاده از آن در پروژه هایی با چند سرویس را بیان کنم.تنظیماتبرای این منظور یک پروژه ASP.NET WEB API Core ایجاد میکنیم ، شما میتوانید از پروژه های MVC Core ، Console و یا حتی Blazor  نیز استفاده کنید.dotnet new webapi -n HealthCheck&#xA;dotnet new sln&#xA;dotnet sln add HealthCheckدر قدم بعدی پکیج HealthCheck را روی پروژه نصب میکنیم.cd HealthCheck/&#xA;dotnet add package AspNetCore.HealthChecks.UIبعد از نصب پکیج باید Middleware آن را در پروژه رجیستر کنیم.تنظیمات اپلیکیشندر فایل Startup.cs و در متد ConfigureService این دستور را می نویسیم.services.AddHealthChecks(); و در متد Configure این endpoint را اضافه میکنیم تا وضعیت کنونی اپلیکیشن را چک کنیم app.UseEndpoints(endpoints =&gt;&#xA;{&#xA;    endpoints.MapControllers();&#xA;    &#xA;    // Mapping a new endpoint to see the health&#xA;    endpoints.MapHealthChecks(&#34;/health&#34;);&#xA;});اما این روش زیاد سودمند نیست. پکیج health checks شامل فرمت های خروجی بسیاری می باشد. این پکیج به گونه ای است که شما حتی میتوانید خروجی شخصی سازی شده ای را داشته باشید. اما بصورت کلی اگر اپلیکیشن شما دارای چندین سرویس مختلف می باشد ، منطقی ترین گزینه استفاده از خروجی به صورت JSON می باشد.داشبورد Health Checkهمانطور که در ابتدای این مقاله ذکر کردم برای دسترسی سریع به سرویس ها نیاز به داشبوردی داریم که بتوانیم سرویس های استفاده شده در اپلیکیشن خود را در آن مانیتور کنیم. برای این منظور از همین پروژه خود به عنوان پروژه مانیتورینگ استفاده کرده تا سلامت پروژه هایی که در ادامه به آن اضافه میکنیم را مانیتور کنیم. دیاگرام زیر هدف نهایی را توضیح می دهد. پروژه اول خود را با کمک داکر به Redis  متصل میکنیم و برای پروژه دوم از سرویس نمونه ای برای مشاهده سلامت سیستم استفاده خواهیم کرد.برای مشاهده از داشبورد ما نیاز به استفاده از پکیج زیر داریم:AspNetCore.HealthChecks.UI.InMemory.Storagedotnet add package AspNetCore.HealthChecks.UI.InMemory.Storageحالا متد های بالا را به صورت زیر تغییر می دهیم.&#xA;services.AddHealthChecksUI()&#xA;        .AddInMemoryStorage();&#xA;&#xA;app.UseEndpoints(endpoints =&gt;&#xA;{&#xA;    endpoints.MapControllers();&#xA;    endpoints.MapHealthChecksUI();&#xA;}); در این بخش حالا سرویس های موردنظر را به solution خود اضافه می کنیم.dotnet new webapi -n Service1&#xA;dotnet new webapi -n Service2&#xA;dotnet sln add Service1 Service2در ادامه در فایل های Services1.csproj و Services2.csproj پکیج رفرنس های زیر را جای گذاری میکنیم&lt;PackageReference Include=&#34;AspNetCore.HealthChecks.UI&#34; Version=&#34;5.0.1&#34; /&gt;&#xA;&lt;PackageReference Include=&#34;AspNetCore.HealthChecks.UI.Client&#34; Version=&#34;5.0.1&#34; /&gt;در آخر در فایل appsettings.json پروژه HealthCheck ، سرویس های خود را رجیستر میکنیم . دقت داشته باشید که آدرس ها به درستی وارد شود. برای مشاهده آدرس هر پروژه به فولدر Properties  و فایل launchSettings.json مراجعه کنید. همچنین توجه داشته باشید که این آدرس بستگی به اسفاده شما از IIS و یا Kestrel ممکن است تغییر کند.&#34;HealthChecksUI&#34;: {&#xA;  &#34;HealthChecks&#34;: [&#xA;    {&#xA;      &#34;Name&#34;: &#34;Service 1&#34;,&#xA;      &#34;Uri&#34;: &#34;https://localhost:5011/health&#34;&#xA;    },&#xA;    {&#xA;      &#34;Name&#34;: &#34;Service 2&#34;,&#xA;      &#34;Uri&#34;: &#34;https://localhost:5021/health&#34;&#xA;    }&#xA;  ],&#xA;  &#34;EvaluationTimeInSeconds&#34;: 10&#xA;},اکنون اگر شما همزمان سه پروژه را استارت کنید قادر خواهید بود که داشبورد health check  را مشاهده کنید.آدرس پیشفرض داشبورد: https://localhost:&lt;app port&gt;/healthchecks-uiآدرس پیشفرض برای مشاهده JSON ها:https://localhost:&lt;app port&gt;/healthchecks-apiرجیستر کردن Health Checksبدون اضافه کردن هیچ پیش نیازی ، سه حالت گزارش را با هم بررسی می کنیم.برای کسب اطلاعات بیشتر برای حالت های مختلفی که health check پشتیبانی میکند به لینک زیر مراجعه کنید: https://github.com/xabaril/AspNetCore.Diagnostics.HealthChecks#health-checksدر ادامه چند مورد از آنها را بررسی میکنیم تا ببینم خروجی داشبورد به چه گونه می باشد.برای این منظور کد زیر را جای کد قبلی در Service1/Startup.cs جایگزین میکنیم.services.AddHealthChecks()&#xA;    .AddCheck(&#34;Foo&#34;, () =&gt;&#xA;        HealthCheckResult.Healthy(&#34;Foo is OK!&#34;), tags: new[] { &#34;foo_tag&#34; })&#xA;    .AddCheck(&#34;Bar&#34;, () =&gt;&#xA;        HealthCheckResult.Unhealthy(&#34;Bar is unhealthy!&#34;), tags: new[] { &#xA;        &#34;bar_tag&#34; })&#xA;    .AddCheck(&#34;Baz&#34;, () =&gt;&#xA;        HealthCheckResult.Degraded(&#34;Baz is degraded!&#34;), tags: new[] { &#xA;        &#34;baz_tag&#34; });سه حالت گزارشدر ادامه می خواهیم Service1 خود را به Redis متصل کنیم تا health check  آنرا تست کنیم.به این منظور پکیج زیر را در پروژه Service1 خود نصب میکنیم.dotnet add package AspNetCore.HealthChecks.Redisهم چنین در فایل appsettings.json این پروژه، connectionString خود را اضافه میکنیم:&#34;Redis&#34;: {&#xA;  &#34;ConnectionString&#34;: &#34;localhost:5002&#34; &#xA;}, و در فایل Service1/Startup.csاین کد را جایگذاری کد قبل میکنیم:services.AddHealthChecks()&#xA;         .AddRedis(Configuration.GetSection(&#34;Redis&#34;)[&#34;ConnectionString&#34;]);حالا Redis خود را به کمک داکر و دستور زیر روی پورت 5002 اجرا میکنیم:docker run --name redis-cache -p 5002:6379 -d redisداشبورد:حالا داکر کانتینر خود را متوقف میکنیم تا خطایی ایجاد کرده و آنرا در داشبورد مشاهده کنیم:اضافه کردن Health Checks دلخواه:به سراغ سرویس شماره دو رفته تا سرویس دلخواه خود را برای health check  پیاده سازی کنیم.برای این منظور ما یک کلاس می سازیم که شامل متدی است که با هر بار اجرا بصورت رندوم وضعیت آن تغییر میکند.public class RemoteHealthCheck : IHealthCheck&#xA;{&#xA;    public Task&lt;HealthCheckResult&gt; CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())&#xA;    {&#xA;        var isHealthy = CheckRemoteEndpointHealth();&#xA;&#xA;        return Task.FromResult(isHealthy ? &#xA;            HealthCheckResult.Healthy(&#34;Remote endpoint is healthy.&#34;) :&#xA;            HealthCheckResult.Unhealthy(&#34;Remote endpoint is unhealthy&#34;));&#xA;    }&#xA;&#xA;    private bool CheckRemoteEndpointHealth()&#xA;    {&#xA;        // Just stubbing it out for demo&#xA;        var random = new Random().Next(1, 5);&#xA;        return random % 2 != 0;&#xA;    }&#xA;}این کلاس را در Startup پروژه جای کد قبلی رجیستر میکنیم.services.AddHealthChecks()&#xA;        .AddCheck&lt;RemoteHealthCheck&gt;(nameof(RemoteHealthCheck));مشاهده میکنید که داشبورد با هر Evaluation یک وضعیت از Service2  نمایش خواهد داد. شما می توانید با تغییر پارامتر EvaluationTimeInSeconds  در فایل appsettings.json زمان آپدیت داشبورد را کم کنید تا نتیجه را سریعتر مشاهده کنید.منابع:https://github.com/Xabaril/AspNetCore.Diagnostics.HealthCheckshttps://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-5.0https://dev.to/sahan/asp-net-core-health-checks-9al</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Sun, 18 Jul 2021 16:06:32 +0430</pubDate></item><item><title>تفاوت REST و GraphQL</title><link>https://virgool.ir/@araash.abs/تفاوت-rest-و-graphol-buxm2ro9suab</link><description>اول از همه بهتره که یک تعریفی از هردو داشته باشیم!تکنولوژی REST (Representational State Transfer) و GraphQL هردو از  API دیزاین هایی هستند که وظیفه انتقال دیتا در بستر پروتکل های اینترنت از جمله HTTP را دارند.  تکنولوژی  REST یک الگوی معماری و GraphQL یک query language  می باشد.تکنولوژی REST می تواند چندین End points داشته باشد در صورتیکه GraphQL تنها یک End point می تواند داشته باشد.3. هردو دیتا را بصورت JSON انتقال می دهند.4. هردو قابلیت عدم تابعیت دارند:عدم تابعیت بدین معناست که هر درخواست HTTP در یک بسته کاملا مستقل اتفاق می افتد. زمانی که کاربر یک درخواست HTTP ارسال می کند ، این درخواست فقط شامل اطلاعات ضروری برای سرور جهت انجام آن درخواست می باشد . سرور به هیچ عنوان به اطلاعات درخواست های قبلی توجهی نمی کند. 5.تکنولوژی REST APIs بسیار منعطف تر است درصورتیکه GraphQL فقط با POST کار میکند !6. در تکنولوژی GraphQL این قابلیت وجود دارد که دیتایی که از سرور دریافت می کنیم را با جزئیات بیشتری درخواست کنیم ، اما در REST این گونه نیست و تمام دیتا واکشی می شود.7.در REST به دلیل تمایل به واکشی تمام داده ها ، مقدار زیادی داده به همراه می آورد که شاید برای کاربر غیر ضروری باشد!درکل هر کدام ازین تکنولوژی ها مزایا و معایب خاص خود را دارند.درصورتی که تازه شروع به یادگیری API کرده اید توصیه می شود که با REST API شروع کنید.و اگر درحال توسعه پروژه سنگین با داده هایی حجیم هستید احتمالا GraphQL گزینه بهتری برای شماست.پایان!</description><category>Arash Abbasi</category><author>Arash Abbasi</author><pubDate>Wed, 14 Jul 2021 11:50:32 +0430</pubDate></item></channel></rss>