خوب create با create builder متفاوت هستش
وقتی که میخوایم از web application استفاده کنیم میایم و builder میسازیم
بین builder و builder . build باید سرویس هامون رو اضافه کنیم
خوب builder میتونیم چیزهای متفاوتی بسازیم ، برای زمانی که وقتی که میخوایم یه موجودیتی رو بسازیم که از اجزا متفاوتی تشکیل شده این کار با factory متفاوت هستش در factory فقط یه سری چک انجام میشه و بعد ساخت انجام میشه
خوب builder مثل خط تولید عمل میکنه
خوب اینجا داره میگه خونه ها رو میسازیم ولی هرکدومشون یه سری قابلیت متفاوت از هم دارند حالا یه خونه هم میتونه همه آپشن ها رو داشته باشه
خوب مشکلی هم که اینجا نوشته راجع بهش اینه که ممکنه برنامه مون خیلی پیچیده بشه چون اومدیم و sub class هایی زیادی رو درست کردیم تا تموم configuration ها و حالت های مختلف رو برای اون object درست کنیم
خوب در تصویر پایین هم گفته که خوده خونه رو ساختن یه سری موارد رو میخواد که نوشتش
خوب حالا مفهومش چیه ؟ میگه که اول خونه مثل اون خط تولید اجزاش دونه دونه تولید و سر هم میشه و بعد اون هایی که مثل بقیه خونه هایی که یکیش باغچه داره یا استخر داره ، اینها به صورت آپشن بهش اضافه میشه
خوب builder ها یه متد همیشه توشون دارن به اسم get result که میاد اون چیزی که ساخته شده رو بهمون میده
یا بهش میگن همون build که داریمش توی app
خوب حالا service ها در برنامه حکم همون آپشن ها مثل استخر و … داره که میتونیم با استفاده از service ها بیایم و یه سری option بهش اضافه کنیم
خوب حالا این سرویس ها همون آپشن ها و چیزهایی هستش که خودمون میخوام به پروژمون اضافه کنیم
خوب middleware یه نرم افزاری که assabmle میشه توی pipeline برنامه برای هندل کردن درخواست ها و پاسخ ها
میتونه pipeline درست کنه که برای هندل کردن req ها و res ها استفاده میشه
ویژگی که داره :
میتونه انتخاب کنه که در pipe line به کامپوننت بعدی req رو انتقال بده
میتونه قبل یا بعد از pipeline یه سری عملیات رو انجام بده
پروتکل ما روی http هستش
مجری برنامه های وب kestel هستش ، که میتونه application ما رو اجرا کنه و بعد میره توی وضعیت listining
خوب kestrel میشه application server ما هستش در Asp .net ولی برنامه exe که داریم application server اش میشه سیستم عامل ما
و kestrel برنامه web ما رو اجرا میکنه و بعد از این که اجراش میکنه بهش گوش میده :
تمامی درخواست ها و پاسخ ها رو kestrel دریافت و ارسال میکنه
خوب به طور مثال وقتی که req میاد اینجا kestrel میاد یه آبجکت .net ای درست میکنه اطلاعات رو داخلش قرار میده و میفرسته داخل برنامه ، یعنی تمامی این اطلاعاتی که توی brwoser داره نشون میده رو میریزه توی یه object و میفرسته توی برنامه که این برنامه میتونه pipeline داشته باشه
و اون resposne هم که توی brwoser داره نشون میده هم kestrel داره میگیره و بعد میده به بروزر
خوب اینجا دیگه kestrel رو نکشیده
ما توی midleware ها pre logic و post logic داریم
خوب با next میایم middleware بعدی رو صدا میزنیم
42
خوب اینجا یک زنجیره مسئولیت داریم ، همونطور که میبیند مثلا ممکنه که یکی اون وسط این سطل آب رو روی سر خودش بریزه یا بده به نفر بعد
مثلا اونی که سطل اب رو ریخته رو خودش یعنی خودش داره پردازشش میکنه و دیگه به بعدی نمیده چرا؟
خوب مثلا فکر کنید که یه سایت فروشگاهی داریم که مثلا فرد واردش میشه سفارش میده و بعد پرداخت میکنه و بعد میره مرحله برای پست و …
خوب چیزی که این سایت نیاز داره اینه که ما باید برای هر شخصی که وارد سایت میشه بیایم و اهراز هویت انجام بدیم
و بعد هم کنترل دسترسی هاش رو چک کنیم
چک کردن مشروعیت درخواست ها که میشه اعتبار سنجی و این که اول از همون اعتبار سنجی در ابتدا انجام میشه و بعد اگر مشروع بود میتونه درخواست های دیگه رو بده
خوب اگر نخوایم دیتابیس رو برای انجام عملیات احراز هویت یا انجام عملیات استفاده کنیم میتونیم از cache استفاده کنیم و استفاده از cache سرعت سیستم رو خیلی بالا میبره
سیستم اتوماسیون اداری در کل کشور داریم ولی محدودیت دسترسی ای پی داریم
برای جلوگیری از dos میتونیم rate limit بزاریم ، اینطوری که مثلا هر کاربر در 1 ثانیه فقط یک درخواست میتونه ارسال کنه
یا مثلا در هر 10 ثانیه 1 درخواست و در هر 5 دقیقه مثلا 10 درخواست میشه
خوب در مرحله ی اول باید بیایم مرحله مرحله چک کنیم ، مثلا اول ip check بعد rate limit یا برعکس و بعد بیاد cache رو چک کنه و … کی هستی به چیا دسترسی داری
این میشه زنجیره مسئولیت ها → این قسمت هیچ ربطی به bs logic نداره و این قسمت مشترکات کل برنامه هستش
خوب middleware ها در chain هستند و pipe line همون chain هستش
و middle ware ها از پترن chain of responsibility استفاده میکنه
مثلا ما با استفاده از builder میایم و یه خونه میسازیم و بعد با استفاده از service ها میایم سفارشی سازیش میکنیم
خوب میرسیم به پروژه
حالا برای پیاده سازی میخوایم انجام بدیم ، پیاده سازی middleware برای گرفتن خطاهای سفارش ها که ممکنه اتفاق بیوفته
از try catch استفاده کنیم حالا اگر استفاده نکردیم و یه خطایی unxpected توی سیستم اتفاق افتاد باید چی کار کنیم /؟
اینطوری باید بهش نگاه کنیم که یه try catch رو کل سیستم میزاره و میگیم که اگر اروری اتفاق افتاد و هیچ کس اون رو هندل نکرد در آخرین لایه دریافتش میکنیم بهش میگن global exceptionn handelting
مثلا کالا 5 داریم و مشتری 10 تا تعداد زده و ممکنه ارور بده
خوب اینجا دیگه اون صفحه که unlande error هست رو دیگه نمیاره
خوب حالا میخوایم یه global exception handling درست کنیم :
پیام ها در این قسمت به صورت عمومی هستند
1:26
خوب حالا از این middleware باید بره توی بعدی
اینجا توی middleware بالایی هیج اتفاقی خاصی انجام نمیشه و لاجیک خاصی نداره برای همین توش اومده middleware بعدی رو با next صدا زده و فقط تنها زمانی اجرا میشه که یک exception ای توی سیستم اتفاق بیوفته
حالا این ها چی هستن ؟ branch middleware
با هر بار استفاده از use یک handler به اون فضای ابری که در تصویر های بالاتر هست اضافه میشه chain of responsibility
هر درخواستی که وارد بشه اول از middleware مون رد میشه بعدش میره توی map get که این ها خودشون یه middlware هستن ولی چون از نوع branch هستن تحت یه سری شرایط اجرا میشن
خوب حالا میخوایم loggin رو هم اضافه کنیم
حالا logger باید قبل از exception handeling باشه یا بعدش باید قبلش باشه
خوب ما میتونیم با شروع log گرفتن و در انتها log گرفتن بیایم و response time سیستم رو بدست بیاریم
در حالت عادی
اگر خطا داشته باشیم
وسطش custom message رو هم مینویسه
اونی که اون بالا نوشتیم دقیقا داریم این پایینی ها رو شبیه سازی میکنیم و داریم میگیم که اگر متد که توی درخواست هستش از نوع get بود و path اش /branch بود بیاد اون custom content رو به عنوان respose برگردونه
و این که middleware ها میتونن endpoint هم بشن این صورت که مثلا ما بیایم مثلا مسیر رو چک کنیم و بعد متد رو چک کنیم و بعد header رو چک کنیم و بعد مثل مورد بالا یه چیزی رو برگردونیم دقیقا میشه مثل کاری که end point ها میکنن
یه مدل هم میایم از convention میریم جلو
خروجی void و اسمش invoke و ورودی http context میگیره
خوب در تصویر پایین که مدل inline هستش ما context رو به عنوان ورودی داریم که از نوع http context هستش و next از نوع request delegate
خوب ما میخوایم برای اجرای بهتر از async استفاده میکنیم اینجا به جای void ما task داریم و بهتره که suffix بیایم از async استفاده کنیم
توی مدل inline هم از async استفاده کردیم
دقت کنید
اینطوری میایم توی program مینویسیمش »
حالا میخوایم یه middleware بسازیم که اگر درخواست از سمت firefox بود درخواست رو drop کنه
این توی firefox هستش
ااین برای کرومه :
حالا چرا اون بالاتر داره بهمون dictionary میده ؟ برای این که خوب همونطوری که اینجا نوشته توی user agent ما یه string کلی داریم که با / به چند بخش تقسیم شده و ما میایم با any میگیم که اگر توش نوشته شده بود firefox کلن درخواست قبول نشه
حالا میخوایم اطلاعات user همراه با req ارسال بشه و بعد بریم بررسیش کنیم ، توی این حالت بهتره که اطلاعات توی header باشه که راحت بتونیم ازش استفاده کنیم و در route نباشه بهتره
خب حالا توی middleware مون باید یه شرطی هم بزاریم مثلا اول باید اول user وارد سایت میشه بره register کنه خودش رو و بعد میخواد از امکانات سایت استفاده بکنه باید login کنه برای همین هم باید حواسمون به این ها باشه که چطوری این middleware رو داریم میچینیم و طراحی میکنیم
تمام