خوب 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 رو داریم میچینیم و طراحی میکنیم

تمام