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