کد های این قسمت معمولا تنظیمات و رویه کل برنامه هستش
فقط هم ورودی برای تنطیمات نیست ، سرویس ها و…
خوب برای این که 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