کد های این قسمت معمولا تنظیمات و رویه کل برنامه هستش فقط هم ورودی برای تنطیمات نیست ، سرویس ها و…
خوب برای این که program .cs خیلی سنگین میشه میایم یه refactor میکنیم برای کوچکتر کردنش دوسطر refactor انجام دادیم یکی برای middleware ها

میتونیم extention method ایجاد کنیم خوب اومدیم middleware extention رو اوردیم که میتونیم روی inteface قسمت application builder میتونیم extention هایی رو ایجاد کنیم

که بیایم logic مربط به registration و در کنارش نحوه و شرایط registration رو پیاده سازی کنیم

خوب توی قسمت اول middleware رو اومدیم و register کردنش رو انجام دادیم

دقت کنیم که در قسمت اول اومدیم از IWebHostEnviroment استفاده کردیم و بعد در تابع برای چک کردن محیط از env استفاده کردیم

در قسمت بعد ولی اومدیم مستقیم از app استفاده کردیم و در متد اومدیم از app . enviroment استفاده کردیم 11

روش توسعه minimal api

خوب توی این حالت اول میایم profile group درست میکنیم و بعد میایم براش End point مینویسیم که اینجا route که براش تعریف کردیم r1 , r2 هستش

برای این که Extention method تعریف کنیم میایم اون رو static تعریف میکنیم

اینترفیس IEnd point route builder و اینطوری ازش استفاده میکنیم :

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

توی program رو comment میکنیم و بعد میاریمش توی profile end point نکته اینه که app روش interface های زیادی هستش

اینجا اومدیم روی webapplication اکستنشن نوشتیم

روی webhost bilder هم میشد این کار رو کنیم یا application builder

بهتره که به جای webapplication روی interface ها مثل Iend point router بیایم و extenntion method بنویسیم

این ها رو از کجا اورده توی middleware extention ، توی کدوم جلسه این ها رو گفته ؟

کلاس های static وقتی که تعدادشون زیاد میشه دیگه قابلیت تست پذیریشون کم میشه

خوب اون توی کامنته هم میشه نوشت ولی پایینیه بهتره

خوب extention method ها خوبن ولی بدیشون اینه که اینجا اگر بخوایم به جای map customer بخوایم map profile رو اضافه کنیم باید یه کلاس استایک رو اینجا اضافه میکردیم و بعد میومدیم impliment اش میکردیم

و به ازای هر end point باید بیایم و این map رو اضافه کنیم که اگر تعدادشون زیاد باشه میشه مصیبت این روش extention method

حالا روش instance

هر دوتای این ها تعداد خط کدشون یکی هستش و به اضای هر کدومیشون باید class بسازیم

ولی اینجا همچمنان ex method ها بهترن ، چون که به لحاط سادگی در اجرا و call کردن بهتره

و دو تا مشکل در instance داریم - یکیش اینه که داریم به صورت inline میایم و instance درست میکنیم ، در صورتی که قرار گذاشتیم که خودمون نیایم instance بسازیم

مورد بعدیش هم اینه که بعد از این که ازش instance درست کردیم اومدیم و روی اون از method رو پیاده سازی کردیم

خوب توی ex method نمیتونیم کد های تکراری رو حذف کنیم ولی توی instance میتوینم ، حالا میخوایم این کار رو انجام بدیم

خوب ویژگی که instance ها دارن اینه که میتون یه interface رو imp کنن ولی کلاس های static نمیتون interface رو imp کنن

ما میخوایم یه فرایند اتوماتیک برای register شدن پیدا کنیم

خوب

خوب

حالا اینجا ما کاری کردیم اینه که دیگه نمیخواد برای هر enpoint دیگه بنویسیم و اومدیم همشون رو unify کردیم

اینجا unterface بهتر شده ولی همچنان اتوماتیک شدن نداریم و new هم از بین نرفته

میخوایم از روش reflection استفاده کنیم

زبان c# وقتی که Compiler اش میرسه به اقلامی که جلوش هست میاد و یه descreptor تولید میکنه ، توصیف کننده چیزی که کامپایلر شناسایی کرده

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

اون اینترفیسه یه متد داره به اسم map end point که اون هم توی ورودیش یه اینترفیس داره به اسم i end point route builder

کامپایلر میاد میگه که من میام این ها رو توی sourse هم بهت میگم که چه خبره

میخوایم برسیم به کلاس assembly برای این کار میایم از type of استفاده میکنیم

خوب اینجا

توی کلاس reflection هستش assembly

حالا میخوایم تمام تایپ هایی که توی پروژه مون وجود داره رو ببینیم

مثلا browser check middleware خودش یه تایپه و …

خوب همین get type خودش یه استعالام از sourse code هستش

یعنی داریم از خوده کامپالر استعلام میگیریم

خوب توی توضیحاتش هم معلومه که آرایه از تایپ ها رو بهمون میده که بعدش ما میخوایم با استفاده از linq بیایم روش query بنویسیم با استفاده از where

خوب حالا میخوایم چیزی رو پیدا کنیم ، نوع هایی که کلاس باشن و interface IEnd point رو پیاده سازی کرده باشن

وقتی که داریم از reflection استفاده میکنیم باید بیایم ازشون type of بگیریم و بعد ازش استفاده کنیم

برای این که IEnd point هم استفاد کنیم باید از type of استفاده کنیم

خوب حالا میاد تایپ هایی کلاس هستند و assignbale به iend point رو بهون میده

حالا کلاس های basket end point و

این دو تا رو شناساسیی میکنه و بعد میخوایم

خوب اولش که آرایه است و بعد where روش اجرا میشه ، میشه Ienumrable و بعد to list میکنیم تبدیل به list میشه و بعدش میتونیم روش foreach رو اجرا کنیم

حالا میخوایم این هایی که انتخاب کردیم رو ببریم توی di و register اش کنیم

59

خوب اینجا شبیه همون رجیستر کردن سرویس هاست ولی دیگه اینجا add اولش نداره یعنی addscope و …

این جا ما یدونه service descreptor داریم که میخوایم اون رو رجیستر کنیم

خوب اینجا که اومدیم transent نوشتیم میایم شبیه به عکس بالایی که اون مدلی رجیستر میکردیم توی di ، اینجا هم اول تایپ اینترفیس رو تعیین میکنیم و بعد کلاس اصلی رو که کلاس اصلی رو قبلا پیداش کردیم در خط بالاییش که توش گفتیم از نوع کلاس باشه و is assignable باشه و اومدیم با استفاده از این ها end point رو با select بدست آوردیم و بعد با استفاده از service descreptor اومدیم اینترفیس ها رو به endpoint ها وصل کردیم و بعد رجیسترش کردیم و از همون هم استفاده کردیم بعد to list اش کردیم

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

به طور مثال اینجا برای پیاده سازیش خیلی داستان داره مثل اینجا

هم باید refelction بدونیم هم باید di بدونیم و … و از طریق همه ی این ها میتونیم کدمون رو کم کنیم و از dry استفاده کنیم

خوب توضیح add endpoint : از طریق reflection میومد و end point ها رو شناسایی میکرد و براش descriptor تولید میکرد و بعد descreptore اش رو میومد توی di contaner رجیستر میکرد

حالا map endpoint میومد از di اون چیزهایی که رجیستر شده رو استخراج میکرد و بعد app رو بهشون پاس میداد تا توی router رجیستر بشن

خوب حالا ما هندلر inline داریم و میخوایم برای هر کدوم از این endpoint بیایم handler بنویسیم

خوب برای این که این ها رو قراره زیاد صدا زدن بشن و ازشون زیاد استفاده بشه بهتره که async نوشته بشن

خوب

از این پترن زمانی استفاده میشه که بخوایم یه web api طراحی کنیم

خوب میشه request- end point - response

خوب تایپ هایی که ورودی هستن ، یعنی از خارج قراره یه دیتا بیاد داخل برنامه و هیچ لاجیک خاصی نداره ، در این حالت میایم از record استفاده میکنیم

خوب حالا میایم request رو درست میکنیم

بعد response رو مینویسیم

خوب

خوب حالا یه چیزی داریم به اسم from body

خوب

خوب برای داکیومنت کردن بهتر میایم از with tag اتسفاده میکنیم

اینجوری میشه

خوب خوب client دیتا اشتباه داده سمت سرور و این ارور رو داده

خوب حالا این order id رو میخوایم بفرستیم با sms ولی باید placeorder resonse رو هم براش درست کنیم

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

برای استفاده ازش از service extention استفاده میکنیم

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

اینطوری میایم ازش استفاده میکنیم

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

خوب

و

خوب اگر بخوایم از طریق constructor بیام و inject کنیم همه اون سرویس های دیگه که مرتبط با endpoint های دیگه هستند همشون باهم یجا دارن inject میشه

برای همین میام از method injection استفاده میکنیم

راه حلش اینطوری میشه :

خوب

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

خوب

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

اینجا توی آرگومان اولیه اومدیم primery injection رو انجام دادیم

برای ایمل هم همینکار رو میکنیم :

خوب اینجا اومددیم و نوتیفیکشن رو اضافه کردیم

خوب اینجا ما فقط notification service رو اضافه کردیم ، ولی ما دو تا روش داریم هم با پیامک و هم با ایمل که تعیین نشده و این باعث ابهام میشه

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

خوب برای این که یه کلید بزاریم برای هر کدوم این ها

اینجوری میایم براشون کلید میزاریم کلید اولی sms هستش و با استفاهد از add keyd singleton استفاده کردیم

و اینجا گفتیم که from keyes service سافتاده میکنیم

دز پشت صحنه پیام هم ارسال میشه

به جای شماره موبایل ، اینطوری مینویسیم

اصلاح:

اتمام ج 6