کدهک
1.92K subscribers
1.3K photos
7 videos
1 file
681 links
آموزشگاه تخصصی دات نت

https://codehaks.com

لینکدین :
https://www.linkedin.com/in/codehaks

یوتیوب:
https://www.youtube.com/@codehaksfa

ارتباط با مدیر :
Admin: @codehak
Email: ghods.hakim@hotmail.com
call: 09380146555
Download Telegram
نگاهی به ADM در مقایسه با RDM که Domain-Driven Design استفاده میشود.
اصل حداقل شگفتی

در طراحی مهندسی Principle of least astonishment یا اصل حداقل شگفتی به تلاش برای عدم سورپرایز کردن کاربر سیستم تعریف میشود.

مثلا در سیستم عامل ویندوز وقتی دکمه ی F1 کیبورد را میزنید انتظار دارید که صفحه ی راهنما نرم افزار یا سیستم عامل را مشاهده کنید. اگر می خواهید اصل حداقل شگفتی را رعایت کرده باشید نباید برای F1 کاربرد دیگری تعریف کنید.

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

این اصل در برنامه نویسی هم اهمیت زیادی دارد. کدها باید گویا باشد و متدها نباید به گونه ای رفتار کنند که کاربر (در اینجا برنامه نویس) را سردرگم کند. در واقع یک متد تنها باید کاری را انجام دهد که در اسمش آمده و نه هیچ کار دیگری. از طرف دیگر استفاده از تکنیک ها خلاقانه برای حل مشکل باید به حداقل برسد. وقتی در یک تیم کار می کنید یا افراد دیگری باید کدهای شما را بررسی کنند راه حل های غیر متعارف می تواند میزان پیچیدگی کد را بالا ببرد و فهم آن را برای همه مشکل کند.
سیستم تزریق وابستگی در ASP Core دارای سه نوع چرخه ی Transient و Scoped و Singleton است.
در ASP Core یک سیستم تزریق وابستگی کم حجم و ساده پیاده شده است که نیاز به استفاده از سایر IoC ها از قبیل StructureMap و Ninject یا AutoFac را از بین میبرد. به طور کلی می توان به سه روش کلاسها (سرویسها) را در این فریم ورک تزریق کرد.

1- حالت Transient
در این روش سرویس در هربار که فراخوانی شود ایجاد میشود.

2- حالت Scoped
در این روش سرویس به ازای هر Request تنها یکبار ایجاد میشود.

3- حالت Singleton
در این روش سرویس تنها در اولین فراخوانی ایجاد میشود و در دفعات بعد از همان سرویس استفاده میشود.
کنترلر در ASP Core

در ASP NET Core یک کلاس درصورتی به عنوان کنترلر شناخته میشود که حداقل دارای یکی از شرایط زیر باشد.

1- نام کلاس دارای پسوند Controller باشد
2- از کلاسی ارث بری کند که آن کلاس دارای پسوند Controller باشد.
3- با اتریبیوت [Controller] مشخص شده باشد.

همچنین نباید دارای اتریبیوت [NonController] باشد.
اکشن ها در ASP Core

در ASP Core اکشن دارای خروجی IActionResult است که در مقایسه با نسخه ی قبلی دامنه ی گسترده ای را پوشش میدهد. با ترکیب شدن Web API درون MVC اکنون می توان پیامهای HTTP مانند BadRequest یا OK را مستقیما به کاربر برگشت داد. در نسخه ی جدید کلاس ApiController دیگر وجود ندارد.

همه ی متدهای Public درون کنترلر یک Action محسوب میشوند مگر اینکه با [NonAction] علامتگذاری شده باشند.

پارامترهای تعریف شده در یک اکشن به صورت خودکار با Model Binding پردازش میشوند و ModelState.IsValid در این نسخه مانند MVC5 عمل میکند.
شبیه سازی خطای NotFound یا 404 با استفاده از یک اکشن فیلتر در ASP MVC 5

لینک گیست :
https://gist.github.com/codehaks/d4172388f869956e79e932b2763504bf
کدهک
شبیه سازی خطای NotFound یا 404 با استفاده از یک اکشن فیلتر در ASP MVC 5 لینک گیست : https://gist.github.com/codehaks/d4172388f869956e79e932b2763504bf
در پروژه های Live گاهی لازم میشود یک بخش از سایت را سریع از سرویس خارج کنید. یک روش حذف فایلهای مربوط به آن بخش است. اما وقتی یک تیم همزمان روی پروژه کار میکندحذف کردن فایل ممکن است عواقب پیش بینی نشده ی زیادی داشته باشد. همچنین شاید در آینده بخواهید این قسمت را دوباره به سرویس برگردانید یا حتی باگی در کار باشد که مجبور شوید به نسخه ی قبلی سویچ کنید.

یک راه ساده و سریع این است که با استفاده از یک اکشن فیلتر تمام درخواستهایی که به کنترلر مربوط ارسال میشود مسدود کنید. در این تکنیک خطای 404 ایجاد میشود و بقیه ی کار به سیستم مدیریت خطا واگذار میشود.
آموزش برنامه نویسی در ASP.NET Core 2.0 آموزش #C و تکنیک های پیشرفته در کد نویسی Web Development

https://www.aparat.com/codehaks
مطمئنا خیلی جاها خوندین که استفاده از Repositroy و Unit of work اشتباه هست..چون خود DbContext حکم همین داستان رو داره.

این یک اشتباه رایج در مورد نحوه ی کار DbContext و الگوی Repository هست. مارتین فاولر در کتاب Patterns of Enterprise Application Architecture که در تعریف الگوی Repository میگه :


A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object
collection.

که مشخصا اشاره میکنه به اینکه Repository یک واسط بین Domain و Data Mapper هست که Domain همون مدلها و سرویسهاست و Data Mapper همون DbContext هست.
در واقع DbContext اطلاعات رو در حافظه ذخیره نمیکنه و برای اجرای هر عملیاتی به سراغ دیتابیس میره . اما Repository قراره داده هارو درون متغیرهای محلی ذخیره کنه که سرعت دسترسی به اونها بیشتر بشه. نقش Unit Of Work اینه که این حافظه ی موقت ایجاد شده رو زنده نگه داره و جلوی ازبین رفتنش رو بگیره تا بشه همیشه خیلی سریع به داده ها دسترسی داشت.

خروجی متدهای DbContext از نوع IQueryable هست. که در واقع یک کوئری هست و نه خود داده ها. یعنی داده ها قبل از اجرای متد وجود ندارن و در لحظه ای که خط داره اجرا میشه از دیتابیس جمع آوری میشن.
ولی در Repository از IList استفاده میشه. که نوع خاصی از آرایه هست که اطلاعات رو در حافظه نگه میداره. و همه ی کوئری های بعدی روی این حافظه انجام میشه .

استفاده از DbContext مثل دستگاه های آب سردکن لحظه ایه. یک مخزن آب دارن که وقتی شما شیر رو باز میکنید آب رو در مسیر سرد میکنه. که فشار زیادی به دستگاه میاره و مصرف بالایی هم داره. اما ریپوزیتوری مثل اینه که بطری های آب رو درون یخچال نگه داری و هر وقت لازم داشتی یکی رو باز کنی و بخوری.
دات نت محلی (NET Native)

وقتی با دات نت 1 تا 4.6 کار می کنید کدها بعد از کامپایل به زبان ماشین ترجمه نمی شوند بلکه به یک زبان میانه (Intermediate Language) تبدیل می شوند. وقتی برنامه را اجرا می کنید دات نت این زبان میانی را در لحظه به زبان ماشین تبدیل می کند که به این عمل ترجمه ی لحظه ای یا Just in time Compile گفته می شود. این عمل در بهینه سازی حجم فایلها و سرعت اجرا برنامه بسیار موثر است.

اما با ظهور گوشی های هوشمند و تبلت ها و با توجه به منابع محدود این دو استفاده از ترجمه ی لحظه ای روش مناسبی نیست و کارایی لازم را ندارد. در دات نت محلی یا Native با استفاده از عمل Ahead of time compile یا ترجمه ی پیاپیش کدها مستقیما به زبان ماشین تبدیل میشوند و زبان میانه حذف میشود .
کجاها می توانید از EF Core استفاده کنید ؟