اینجا باید اول باید 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 اومد مثلا میاد ازش استفاده میکنه