اینجا باید اول باید Docker desktop رو داشته باشیم و بعد اگر این تیک رو بزنیم میاد دو گیگ رو دانلود میکنه

اگر نزنیم میاد روی IIS میاره اگر اون تیک رو بزنیم میاد روی ماشین مجازی docker میاره

خوب اینجا توی main میاد و Create host builder رو کال میکنه و بعد میگه که host بیاد و با استفاده از args بیا و یه create deafult builder رو درست کن

اگر هم توی args هم چیزی نیست از تنظیمات دیفالت استفاده کن و با استفاده از web builder و تنظیمات که توی start up تنظیماتش هم انجام میشه

که بعد از این قسمت ها میره در همون main و میگه که build میشه و بعد run میشه

خوب net core cross platform هستش

خوب توی پروژه ها وب نیاز به وب سرور داریم و وقتی که ما پروژه میرنیم میره iis رو run میکنه و پروژه رو اجرا میکنه

توی net core یه چیزی که داریم اینه که یه web server ای داریم که open source هستش و وقتی که request میاد سمت پروژه اون رو اجرا میکنه

خوب ما توی سرور های ویندوزی میتونیم از IIS استفاده کنیم ، به عنوان یه پروکسی عمل میکنه

خوب وقتی که میخوایم از این کلاس startup استفاده کنیم لازمه اش فقط اینه که دو تا متد Configure service و Configure رو توش اجرا کنیم

چرا اینترفیس درست نکرده که مجبور بشیم این ها رو پیاده سازی کنیم ؟ برای dependency injection

14:57

به طور مثال اینجا ممکنه تابع configure service یکی یا دو تا یا چند تا ورودی داشته باشه برای همین هم میخوایم از DI استفاده کنیم

خوب configure service اینجا میایم و سرویس هایی که میخوایم ازشون استفاده کنیم رو مینویسیم و ست کردن di ها که جلوتر توضیح داده میشود

خوب CONFIGURE برای استفاده از middleware ها استفاده میشه یا خلق middleware ها

خوب در مدل قدیمی تر از custom action filter ها استفاده میشده که on action executing , on action executed میشه

این اول pipline بوده اسمش و بعد اسمش شده middleware

همیشه لزومه نداره که req تا آخرین مرحله بره تا برگرده

بحث pay for play هر چقدر پول بدی آش میخوری

خوب MVC Classic :

ولی توی MVC CORE محدودیت نداریم

وقتی که view ساختیم هم این ویو همینطوری بالا نمیاد باید یه سری کار انجام بدیم

اینجا وقتی که از use mvc استفاده میکنیم میاد یه پکیج با کلی امکانات رو میاره برای استفاده در صورتی ما فقط میخوایم اون چیزهایی که میخوایم رو اد کنیم

اینجا گفته شده که اگر root یا همون / رو بزنیم یه متن برای طرف ارسال بشه

توی MVC داریم system.web.mvc.controller

در mvc core یه لایه قبل از Action result رو هم داریم به اسم IAction result

خوب حالا برای این که بخوایم view رو پروژه رو بیاریم بالا از این کد ها استفاده میکنیم :

وقتی که use mvc میزنیم میاد همه ی اینها رو به پروژه اد میکنه که نمیخوایم

خوب وقتی که از این دو تا دستور آخر با هم استفاده کنیم میشه معادل add mvc

وقتی که از add controllers استفاده میکنیم :

این ها رو مینویسیم :

وقتی که از end point map controller رو بزنیم دیگه routing کار نمیکنه اینجا ما اومدیم contoller رو شناسوندیم ولی مسیر دسترسی بهش رو تعیین نکردیم که برای این کار چند تا راه هستش اول این که باید بیایم از map controller route استفاده کنیم و بعد بیایم توی همون controller بیایم و مسیر دسترسی بهش رو هم تعیین کنیم و اینطوری درست کار میکنه

حالا اگر بخوایم یه route رو به صورت دیفالت تعیین کنیم

اینجا داریم میگیم که دیفالت کنترلر home و دیفالت action مشه index و بعد این که id هم اختیاریه چون ؟ رو داره

برای این که برنامه درست کنه از اون قسمت هایللایتش فقط استفاده میکنیم و map controller رو پاک میکنیم

خوب ما پروژه ای میخوایم که بکش جدا باشه و فرانتش جدا برای همین میایم فقط از

خوب powershell امکاناتش از command prompt بیشتره

میتونیم چند تا power shell داشته باشیم

دستور info بقیه ورژن های نصبی با فولدرهاش رو نشون میده

توی کد پایین میره یه فولدر به اسمه commander میسازه و یه پروژه به همون اسم میسازه

وقتی که میزنیم code . رو میره پروژه رو از توی اون فولدر باز میکنه

نکته web config در پروژه های قدیمی ساختارش xml هستش

توی ساختار جدید app setting داریم که ساختارش json هستش

مثلا اینجا از configuration برای گرفتن یه سری از تنظیمات مثل connection string ها استفاده میشه

دو تا داریم از این ها یکی برای زمانی که دولپ هستش اون یکی برای production

این تنظیمات برای اجرا و lunch هستش تنظیمات پورت و iis و kestrel و …

این رو کامنت میکنیم :

خوب ما وقتی که ssl برای سایت گرفته باشیم سایتمون روی http و https باز میشه حالا این معنیش اینه که اگر کسی http زد به صورت اتوماتیک بیاد redirect کنه روی https

این رو هم کامنت میکنیم چون میخوایم همه چی فعلا public باشه

خوب اینجا دو تا آدرس داریم یکی برای http و یکی برای https

با control + C هم پروژه استوپ میشه

اینجا وقتی که به local host 500 درخواست میزنیم - ارور میده ، چون که ما تعیین نکردیم کدوم conteroller و کدوم نوع درخواست نوع restful هستش میشه کنترلر + نوع درخواست یعنی مثلا کنترلر home و نوع درخواست get مثلا

در مدل restful به صورت پیش فرض اصلا با اسم action ها کاری نداریم ف اینجا به طور مثال وقتی هم که اسمش رو تغییر بدیم تاثیری نداره

وقتی که توی browser میزنیم یعنی اون کنترلر و از نوع get هستش

باید postman هم داشته باشیم چرا که دیگه توی brwoser نمیتونیم درخواست رو خودمون post بزنیم

برای hot reloding میتونیم این کار رو انجام بدیم :

قسمت 4 و 10:15

این کد پایین اصلا کار نمیکنه چون controller اش اصلا از کلاس درستی ارث بری نشده

ورژن درستش میشه این »

خوب اون قسمتی که کامنت شده داره این رو میگه که controller کلاس کلی هستش که توش همه چی هستش ولی ما در حال حاضر فقط میخوایم از controller ای استفاده کنیم که view نداره برای همین میایم controllerBase استفاده میکنیم

خوب اینجا اومدیم و از map controllers استفاده کردیم

در این حالت دیگه ما routing نداریم و خودمون باید routing رو به صورت دستی در controller تعیین کنیم

اینجا get رو هم بهش اضافه کردیم ولی همچنان کار نمیکنه باید مسیر براش تعیین کنیم

نکته : لزومی نداره اسم کلاس کنترلر آخرش controller داشته باشه ، و این که لزومی نداره اون route هم که تعیین میکنیم با این اسم ها یکسان باشه

نکته اگر برای گنترلر تعیین نکنیم Get یا post هر دوتاشو قبول میکنه

توی استاندارد جدید اسم controller رو جمع میکنند مثلا اگر person باشه ، میشه people Controller که یعنی جمع میشه یا اگر command باشه میشه Commands Controller

حالا وقتی که استاندارد رو رعایت کنیم و بعد بیایم برای مسیر یابی از [ ] استفاده کنیم میاد به صورت اتوماتیک اسم controller رو میزاره که اینجا به طور مثال میشه Commands

اسم تابع در صدا زدنش اهمیتی نداره

خوب یه حالتی هم هست برای sub section :

خوب وقتی که اینطوری استفاده کنیم :

چه routing باشه و چه نباشه اینطوری از آدرس root استفاده میکنه میتونیم جنس خروجی رو تعیین کنیم : اینجا خروجی رو models.command گذاشتیم

نکته ی خیلی مهم تر اینه که این آبجکت رو به صورت json برمیگرونتش

اینجا همونطور که میبینید json رو به صورت pascal case همه اطاعات رو آورده به صورت اتوماتیک تبدیل کرده

توی تکنولوژی های آبی رنگ به ازای هر کاربری که وارد سایت میشه یه thread ساخته میشه و بهش اختصاص داده میشه

ولی در node js اینطوری نیست و کلا یه thread هستش

حالا میخوایم از sync به async تبدیلش کنیم

نکته ی بعد اینه که وقتی که از attribute api controller استفاده نکنیم وقتی که route تعیین نکرده باشیم فقط اون کنترلر کار نمیکنه وقتی که ازش استفاده میکنیم در صورتی که مسیری براش تعیین نکرده باشیم بهمون ارور میده

خوب client میشه front و server میشه کد بک اند و DTX میشه کتابخونه هایی که reusable هستند و models مدل هایی که معادلش در جداول دیتابیس هست و view models میشه چیزهایی که بین view و model میخوایم Share کنیم عنوان ها و کامنت ها و .. میره توی resourse در data باید database context داشته باشیم

از linq برای itrate کردن توی collection های مختلف استفاده میشه

نکته : وقتی که read only تعریف میکنیم یا همون موقع باید بهش مقدار بدیم یا در constructor بهش مقدار بدیم بعدش دیگه نمیتونیم

اینجا اومده repo رو توی constructor اومده new کرده

خوب وقتی که داریم از Action result استفاده میکنیم میتونیم ok رو هم بفرستیم

نکته ی جالب اینه که ok از action result ارث بری کرده و inherit شده

یعنی داده + کد

راه درست اینه که action result رو بنویسیم برای این که بتونیم ok رو بفرستیم و بعد خروجی رو هم تعیین میکنیم که در اینجا به طور مثال تعیین کردیم که collection generic هستش

توی این پایینی دیگه نمیشه ok فرستاد

در حالت بعدی میشه :

اینطوری هم داریم اون action result رو برمیگردونیم و هم تعریف کردیم که جنس اون خروجیه چیه که اینجا collection است از command ها

مقایسه دو تاشون

خوب حالا به طور مثال اگر بخوایم یه دیتابیس داشته باشیم و با اطلاعات اون بیایم تستمون رو انجام بدیم :

اینجا میرسیم به مفهموم di به این شکل که ما میخوایم به جای این که بیایم و توی این کنترلر بیایم و repository رو new کنیم به جای این کار میخوایم اون reposisitory که میخوایم رو در constructor بهش injcect کنیم

ایراد اینه که زمانی که بخوایم unit test بنویسیم

توی این حالت باید بیایم از command controller شی بسازیم بعد متد get all رو بزنیم و تست کنیم ولی همیشه محکومیم که از همین this is not good repo یا همون db context که به دیتابیس واقعی وصل هستش باید استفاده کنیم ولی توی تست اینطوری نیست ، توی تست با داده هایی که خودمون میسازیم میایم تست رو انجام میدیم

ما میخوایم خودمون یه repo تستی بسازیم و اینجکت کنیم و با اون تست بگیریم

خوب این کنترلر وابستگی داره به repo , به جای این که بیایم repo رو توی کلاس new کنیم وقتی که new میکمنیم محکوم میشیم که فقط از همون استفاده کنه

حالا میخوایم یه کاری کنیم که بشه توی constructor بهش inject کرد

خوب چون Repo از Irepo ارث بری کرده و ما هم داریم توی ورودی میزنیم Irepo پس به Repo هم دسترسی داریم ، طبق اصول upcasting که میگه که هر متغییری از کلاس یا اینترفیس پدر میتواند به اشایی از جنس فرزندانش اشاره کند

خوب اینجا اگر googli repo هم از Irepo ارث بری کرده بود میتونستیم توی ورودی بهش بدیم

حالا میخوایم توی پروژه ی واقعی ، از mvc میخوایم که به صورت اتوماتیک بیاد و یه repo بسازه و بفرسته و توی unit test یه کلاس به اسم googli repo درست میکنیم و داده ها رو توش میزارم و بعد به some class میایم inject مکینیم که بتونه تتست رو انجام بده

خوب برای همین یه کلاس میسازیم یه interface اش رو ، خودش توی پروژه استفاده میکنیم و یه repo mock برای تست استافاده مکینیم که از اون اینترفیس ارث بری میکنه

دیگه اینجا filed نمیتونیم بنویسیم توی interface فقط میتونیم پراپرتی و متد یا ایونت دیگه Access modifire نداره چون به صورت دیفالت public هستش و body نداره فقط اسم ها هستش

اگر نخوایم بنویسینم که کلاسمون از چی ارث بری کرده میایم از object ارث بری میکنیم در C# هر کلاسی از یک کلاس دیگه و میتونه چند تا اینترفیس ارث بری کنه

خوب اینجا دیگه Deafualt constructor رو نمینویسیم و فقط ورودیش میایم ICommad repo رو مینویسیم

وقتی که command controller رو new میکنیم constructor صدا زده میشه و ما توی ورودی constructor اومدیم ICommand repo رو گذاشتیم خوب حالا کلاس هایی که ازش ارث بری شده یکی Icommand repo مثلا که میایم اول ازش یه شی میسازیم و بعد میایم command controller رو new میکنیم و توی constructor اش میایم و اون ICommand repo رو بهش میدیم

آیا ما در پروژه های MVC خودمون مگه controller رو new میکنیم ؟ نه خوده معماری mvc خودش میاد کنترلر رو new مکینه

خوب ما توی این مورد نیاز به معماری di داریم که به اون ساختار و Frame work بفهمونیم که وقتی که یه کلاسی میخواید new بشه که یه چیزی توی ورودی constructor اش هست بیاد اون رو بسازی و بعد ببرتش و وارد کلاسش کنه

ولی این کاری که ما میخوایم بکنیم autamitic dependecy injection هستش در mvc کلاسیک برای این کار از lib استفاده میکرند که این قابلیت رو به mvc بده

ولی توی Api core این قابلیت از اول روش هست

اگر یه کلاسی پیدا کردی که مثل commadn controller که برای new کردنش نیاز به یه چیزی هستش مثل Icommand repo هستش برو از فلان کلاس برو یه شی بساز و بعد inejct کن (مثلا Icommnad repo میشه Command repo )

و این میشه automatic dependecy injection

اینجا میتونیم یه سری سرویس رو اضافه کنیم و این که Di ها رو declare و تعریفش کنیم اینجا داریم add conterller که یه Service ههستش رو به پروژه اضافه میکنیم

پایین تر داریم میگیمم که اگر قراره از خودت از یه کلاسی شی بسازی (اینجا خوده برنامه داره از controller داره شی میسازه ) و اگر ورودی اون شی که داری میسازی از جنس ICommand repo بود بیا از کلاس Commadn repo یه کلاس بساز و به اون کلاس inject کن

خوب از 8 صبح تا 12 سایت داریم که 100 تا کاربر میاد توش و 10 بار Req میده به همین command اگر ما add singlethon کرده باشیم اولین نقر که اولین req رو میزنه به command اون میاد از کلاس commadn repo یه شی میسازه و میاد inject میکنه و بعد برای تمامی کاربر ها از همون استفاده میکنه

اگر Addd scope باشه میاد یه شی به نام command repo درست میشه و برای همون کاربر استفاده میشه یعنی به ازای هر یوزر یک شی جدید درست میشه و برای خوده همون user استفاده میشه

اگر transent باشه به ازای هر Req یک شی جدید ساخته میشه یعنی اگر 1000 تا req هم داشته باشیم 1000 تا شی جدید ساخته میشه

خوب برای dbcontext باید قطعا add transent باشه چون هر سری که کاربر req میده چون داده داره و user داره و … باید یه بار new بشه

اگر ما بیایم به command repo بیایم و req بفرستیم میاد توی constructor command conterller و بعد میبنه که توی ورودیش یه اینترفیس هستش به اسم Icommadn repo و بعد میاد طبق چیزی که براش تعریف کردیم از کلاس command repo یه شی جدید درست میکنه

واینجا دیگه _repository _ دیگه null نیستش و میایم ازش استفاده میکنیم اگر درخواست get اومد مثلا میاد ازش استفاده میکنه