نکته ای که هست اینه که در مورد 4 ام که پایینی هستش ما اومدیم و awite رو پاک کردیم و در آخرش هم اومدیم از result استفاده کردیم که همین کار باعث شده که تابع async تبدیل بشه به sync که این کار اشتباه است

با استفاده از task run اومدیم و بلاک کد به صورت async اجرا میشه

دقت داشته باشیم که برای async کردن یه تابع نیاز داریم که اون اکشنی که میخوایم از نوع اکشن های دیتابیسی باشه ، یعنی این که به طور مثال دیتابیس رو هم اضافه کرده باشیم و چون داریم با collection ها هم استفاده میکنیم باید linq رو هم اضافه کنیم تا بتونیم از تابع های to list async , … و دیگر async ها استفاده کنیم

نکته برای تعیین مسیر به جای api مثلا میتونیم اون کنترلرهایی که مرتبط با یک موضوعی هستند که اینجا به طور مثال api هستش رو بریزیم توی یه فولدر و بعد اسمش رو هم اینطوری بزاریم توی route

در کنترلر از controller base اومدیم ارث بری کردیم که میشه پایه ترین کلاس کنترلر ها و داخل کنترلر به یک منبع داده نیاز داریم اینه که میتونه هر چیزی باشه و میتونیم به دو روش این مبنع داده رو وارد کنترلر کنیم یکیش اینه که داخلش بیایم و new اش کنیم که اینطوری محدود به استفاده از همون هستیم فقط و راه دوم DI هستش

برای این کار میایم و توی constuctor اون چیزی که میخوایم رو بهش میدیم ، نکته ای که هست اینه که اون چیزی که میخوایم معرفی کنیم باید interface باشه و باید در جایی تعیین کنیم که اگر جایی در برنامه میخواست چیزی رو درست کنه و new کنه که توی ورودیش یه interface هستش به جای اون اینترفیسه بیا و این یکی کلاس رو new کن و ازش استفاده کن ، برای همین میایم توی startup :

خوب نکته ای که هست اینه که این ها دو تا پارامتر میگیرند اولیس اینترفیسه و دومی اون کلاس هستش

تمام توابع رو به صورت async مینویسیم مورد بعدی action result بنویسیم برای این که نوع respose رو میخوایم برگردونیم نوع خروجی رو هم به صورت کامل بنویسیم

قسمت 8

در entity framework مدل های ما poco هستش یعنی لزومی نداره که از اینترفیس یا کلاسی inherit کنند ولی database context اینطوری نیست و باید از dbcontext ارث بری کنه

در ورودی controctor چیزی به نام otions داریم که با استفاده ازش میایم از دنیای بیرون یه سری اطلاعات رو واردش میکنیم مثل connection string

چون اسم مدلمون command هستش میایم با اسم جمع مدلمون رو میسازیم و اسمش رو میزاریم Commands

در ef classic اگر اسم مدل بود Command خودش به صورت اتوماتیک اسم مدل رو commands میزاشت ولی در EF Core هر چیزی اسم گذاری کنیم میشه همون

خوب حالا میخوایم به جای این که بیایم در کنترلر repo رو new کنیم بیایم با DI این کار رو انجام بدیم

برای این کار باید بیایم و به contructor اون رو inject کنیم و بعد ازش استفاده کنیم

برای استفاده ازش باید از transient استفاده کنیم که به ازای هر request یه شی درست بشه

مثلا اگر یه شخصی درخواست داد و بعد از دوباره درخواست داد دوتا شی جدا درست میشه

خوب توی دیتابیس یه سری امکانات خاص داریم به طور مثال این addDbContext کاره همون transient رو داره انجام میده در قسمت بعدی داریم به صورت generic میایم و دیتابیس رو بهش میدیم

خوب بعد توی قسمت option میایم میگیم که میخوایم از sql server استفاده میکنیم

خوب اون configuration از کجا اومده :

خوب همون اول برنامه میخواد اجرا بشه میخواد startup رو اجرا کنه و بعد میبینه که در ورودیش IConfiguration هستش بعد میره به صورت اتوماتیک configuration رو میسازه

اون چیزهایی که ما خودمون میخوایم بسازیم رو میریم توی configuration service مینویسیم ولی موارد built in که برای خوده برنامه است توی startup انجام میشه

نکته ای که هست اینه که Configuration اینجا set نداره ولی در startup اومده set شده ! چجوری ؟

اینجا یه مورد خاص هستش

نکته constant , read only خوب constatnt برای کلاس هستش و Read only برای اشیا هستش ، مورد بعدی اینه که constant ها رو همون موقع که میسازیموشن باید بهشون مقدار اولیه بدیم ، read only هم همون موقع که ساخته میشه باید بهشون مقدار بدیم یا توی constructor

خوب به جای ورژن بالا اینطوری میتونیم بنویسیم :

جلسه 9

برای کامپایل کردن dotnet build استفاده میکنیم

نکته : up در مقابل down هستش

خوب برای حذف کردنش هم از remove استفاده میکنیم

جلسه 10: خوب زمانی پیش میاد که بخوایم برای view که داریم از یه سری model استفاده کنیم برای همین کار میایم توی پوشه ی view models و اون چیزی که میخوایم رو میسازیم به طور مثال اگر ما بخوایم register کردن کاربر رو چک کنیم ممکنه که بگید از user استفاده کنیم برای مدل ، ولی نمیشه چون در چک کردن کاربر ما یه سری فیلد داریم که توی جدول user نیست و ما باید برای این کا اون model که میخوایم برای این کار رو درست کنیم

توی فولدر resources میایم busisness logic رو میاریم قبلا اسمش BLL بوده اینجا ما میخوایم shared busisness رو بنویسیم یعنی ممکنه چند جا استفاده بشه

در پروژه هیچ چیزی نباید به صورت hard code باشه هر متن و عنوان یا موارد دیگه

توی VS code ما resourse ندارد

برای این که میخوایم توی کل پروژه استفاده کنیم میایم public اش میکنیم

نکته : این name ها تبدیل به property میشن اینجا اتفاقی که میوفته اینه که در پشت صحنه میره و یه کلاس درست میکنه و به ازای هر اسمی در name میاد و به پراپرتی میسازه

در نتیجه name ها محدودیت دارند مثلا اسم پراپرتی نمیشه space داشته باشه ولی در قسمت value محدودیتی نداره

ستون comment فقط برای توضیحات خودمون نوشته شده

خوب برای تغییر زبان اینجا کافیه که ستون value رو ترجمه کنیم اینطوری زبان سایت تغییر میکنه

خوب اینجا به صورت اتوماتیک وقتی که شرایطش انجام نشه به صورت دیفالت یه پیغام میده حالا ما میخوایم این پیام رو عوض کنیم

خوب برای این که پیغام به صورت dynamic باشه این کار رو میکنیم : اینجا به حجای اون 0 میاد و اسم اون پراپرتی رو میزاره

اگر اون پراپرتیمون attribute dispaly رو داشته باشه به جای این که اسم اون پراپرتی رو بنویسه میاد پیام اون display رو مینویسه

خوب اینجا میخوایم به

خوب داریم میگیم تایپ ارور از نوع error massage هستش و از نوع resource هستش و در قسمت دوم required که داره key رو میدیم بهش

اینجا magical string داریم که همین باعث میشه که ممکنه به ارور بخوریم

خوب smart resourse رو برای رفع این مشکل استفاده میکنیم حالا یه قابلیتی داریم به اسم name of

وقتی که میرسه به { } میره میبینه و چک میکنه که dispaly داره یا نه ، اگر نداشته باشه عینا اسم propery رو میزاره ولی اگر داشته باشه میره دوباره از روی resourses دوباره میخونه و بعد اون پیغام رو میسازه

قسمت 11

خوب culture در حال حاضر 2 حرفی مثلا fr en fa ,…

و 5 حرفیه fa-IR , en-UK

میرسیم به resourse :

اون آبی ها میشه slave

معمولا اینطوریه که master زبانش انگلیسی باشه و دومی فارسی برای این که دکمه ها رو فارسی کنیم

خوب اگر بخوایم button ها رو دو زبانه کنیم به جای این که new کنیم باید بیایم همونی که هست رو کپی کنیم خوب resourses باید از نوع dot net standard باشه

اگر culter فارسی باشه اول میره توی همون فایل فارسی اگر پیدا کرد برمیداره اگر نه میره از روی master میخونه

نکته : وقتی که از جای دیگه فایل رو میگیریم میخوایم بزاریم توی پروژه نباید designer اش رو کپی کنیم

فقط کافیه که بریم resx رو کپی کنیم و بعد توی Resourse توی visusal studio بیایم و paste کنیم

دو تا layout هم درست میکنیم و براساس culture تغییرش میدیم

جلسه 12

یه فولدر میسازیم به اسم infrastructure و میایم کلاس های reusable رو توش مینویسیم

این کلاس ها همه جای پروژه میتونن استفاده بشن و میتونیم بیایم و در هرجای پروژه که میخوایم customize اش کنیم

خوب name space که داریم توی پروژه میشه namespace خوده پروژه بعد دات و بعد اسم پروژه

پوشه های models , view models و infostructure

میشه name space خوده پروژه دات اسم پوشه

اسم name space رو خوده اون پوشه میزاریم چون که وقتی که بخوایم مثلا پروژه حسابداری داشته باشیم به اسم accounting اینجا میشه accountg . infostructure

در این حالت اگر بخوایم از کلاس های infostructer در حاهای دیگه هم استفاده کنیم دیگه لازم نیست که namespace اش رو عوض کنیم

خوب اولین atrribute رو گذاشتیم برای این که اگر route رو تعیین نکردیم بهمون ارور بده و بعدی اومدیم route رو تعیین کردیم و سومی برای اینه که تعیین کنیم که json ارتباط داره

بعضی از کنترلر ها با دیتابیس کار میکنند یه سری هم نه

این جا مورد استثنا داره میگه که اگر ما پراپرتی رو تعریف کنیم که فقط get داشته باشه میتونیم توی constructor استثنا بهش مقدار بدیم

قسمت 12 تایم 16

خوب database context میره داخل unit of work و این که unit of work معادل database context هستش

خوب DI :

خوب در مباحث دیتابیسی باید از transient استفاده کنیم یعنی به ازای هر کاربر و هر req که ارسال میشه یه instance ازش ساخته بشه اینجا این خط به این معنی هست که هر جایی که در ورودیش از اینترفیس IUnitOfwork استفاده شده بیاد و یه نمونه از Unit of work ساخته بشه و inject بشه

حالا اینجا داره میگه که خوده unit of work یه سری پارامتر های ورودی داره که اینطوری میایم بهش مقدار دهی میکنیم

خوب توی اسم ها view model ها شبیه به همون dto ها هستند چون همون کار رو دارن میکنن

خوب برای ساختنش View model مینویسیم آخرش

اینجا به طور مثال اون قسمت هایی که توسط user داره پر میشه ، اون قسمتی هایی هم که توسط سرور باید پر بشه هم توسط سرور پر میشه و در نهایت کل این اطلاعات return میشه

خودمون یه کلاس برای برگردوندن نتایج ساختیم :

خوب اینجا جای models.application میتونیم از resultWithData و بعد models.application استفاده کنیم

قسمت 13

اول on action executing و بعد action و بعد on action executed میشد

خوب middleware ها قبل از ورود به action اتفاق میوفتد یعنی بعد از آخرین middleware میره وارد action میشه و بعد همون مسیر رو برمیگرده

در قسمت بالا ما یه middleware داریم که گفته هر request که به آدرس / اومد بهش پیام hello word رو بفرستیم

هر چیزی غیر از آدرس / بنویسیم کار نمیکند

خوب این کد بالا داره این رو میگه که هر req ای با هر verb به هر آدرسی زده شد بیا و hello world رو برگردون

خوب middleware ها اگر run باشند یه کاری رو انجام میدن و تمام میشه و سراغ middleware بعدی نمیره

خوب حالا مدل بعدی :

خوب اینجا داره میگه که بعد از این که middleware اولی انجام شد بره بعدی که همون next هستش در نسخه های قدیمی از next invoke استفاده میکنیم

نکته ای که هست اینه که middleware بعدی میشه app run و میره داخلش کار رو انجام میده و بعد هم تمام میشه و این قسمتش خیلی مهمه چون برمیگرده میره سراغ دستورات بعدی next که در قسمت بالایی نوشتیم

اینجا دستوری نوشته نشده ولی اگر نوشته شده بود زیره await next میشد

توی این حالت هم ما hello word 1 , 2 رو میبینیم

وقتی که arrow function بیشتر از یه مورد ورودی داره باید از پرانتز استفاده کنیم در غیر این صورت نمیخواد

خوب نتیجه به این شکل میشه :

خوب یه middleware داریم به اسم map که داریم اینجا ازش استفاده میکنیم به این صورت که اگر /test رو بزنیم میره و greeting رو اجرا میکنه

حالا اینجا حالتی که پیش میاد اینه که وقتی که ما /test رو نزدیم میره hello world رو اجرا میکنه ، ولی وقتی که /test رو میزنیم میره greeting رو اجرا میکنه و دیگه app . run رو اجرا نمیکنه

حالا اگر بخوایم app run هم بعدش اجرا بشه باید next رو توی greeting مینویشتیم

خوب اینجا فرض کنید که توی فولدر wwwroot اومدیم و یه فایل index.html گذاشتیم

**

حالا میخوایم بهش دسترسی پیدا کنیم ولی همچنان داره بهمون hello world نشون میده

خوب این middleware میاد نگاه میکنه ببینه که فایلی با اون اسمی که درخواست شده رو داریم یا نه ، اگر وجود داشت فایل رو میده ، اگر وجود نداشت میره بعدی

دقت باید داشته باشیم که ترتیب این middleware ها به چه صورت است و این که وقتی که run داشته باشیم یعنی انجام میشه و تمام ولی use ادامه داره

وقتی که break point میزاریم برای تست middleware با این که یه بار req زدیم ولی دو بار واردش میشه ، علتش اینه که مثلا وقتی که یه صفحه html رو درخواست میکنیم ، این میاد و fav icon رو هم باهاش میفرسته

برای همین بهتره که root پروژه fav icon رو داشته باشیم

قسمت 14

کلاس که قراره middleware باشه نباید از کلاس دیگه inherit شده باشه و نه از اینترفیسی

نکته اش اینه که باید constructor ای بنویسیم که ورودیش از جنس request delegate باشه

مرحله ی بعد نوشتن تابع invoke هستش که باید async باشه و چون خروجی نداره فقط میزنیم task

اگر void هستش خروجی :

خوب حالا چطوری میتونیم به کدمون بگیم که از این middleware استفاده کن از use middleware استفاده میکنیم

خوب خودمون میخوایم middleware static رو درست کنیم :

خوب یه نکته ای که داره اینه که ما اومدیم تعریف کردیم که اگر آدرس خالی بود برو به middleware بعد برای همین next رو نوشتیم و بعدش اومدیم return رو زدیم چون اگر برگشت هم کاری نداریم ، برای همین return اش کردیم

خوب اینجا داریم میگیم که بعد از / برو بردار هر چی بود رو

و css/site.css رو برمیداره میریزه توی path

توی mvc کلاسیک داریم sever . map pad رو داشتیم ولی توی core دیگه نداریمش

چون نیاز داریم به آدرس فیزیکی باید از host envitoment content root path استفاده کنیم

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

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

بیایم یه extention method بنویسیم برای استفاده از middleware ها

خوب حالا برای این که extestion کنیم باید چند تا کار انجام بدیم : اول این که static اش کنیم بعد public اش میکنیم قبل از اولین پارامتر ورودی این رو مینویسیم - اسم اون کلاسی که میخوایم بهش extent کنیم

اون هایی که کنار مکعبشون فلش داره extention method هستند و به صورت built in نبود اند و خوده microsoft اومده در جای دیگه ای بهشون اضافه کرده

آخر این قسمت راجه به middleware excption handling صحبت میکنه

قسمت 15

موضوع cors :

به خاطر مباحث security اتفاقی که میوفته اینه که اگر req از سمت سایتی به غیر از y.com به سمت x.com بره سرور اون رو جواب نمیده ، حتی میتونیم تعیین کنیم که فقط get ها رو جواب بده

خوب توی این حالت که هم بک اند داریم و هم فرانت اند باید بزنیم که چند تا پروژه با هم روی حالت run قرار بگیرند

خوب توی تنظیمات برای cors ما میایم و قسمت register , login رو برای همه باز میزاریم ولی بقیه ی قسمت ها که کارهای مربوط به admin هست رو میبندیم و میگیم که فقط از یه ip و با یه سری تنظیمات خاص میتونه بهش دسترسی پیدا کنه

خوب حالا مثلا برای این که بخوایم cors توی کنترلر که مرتبط با login , register فقط عمل کنه به صورت attribute میایم بالاش مینویسیم