خود endpoint ها هم یه مدل middleware شرطی هستند اینجا داره میگه که این ها میتونن از service ها استفاده کنن

خوب middleware محل مناسبی برای پیاده سازی bus logic نیستش

خوب مورد اول اینه که ما شاید بخوایم aganet ها و مدل browser ها رو چک کنیم چرا که شاید برخی از این ورژن ها شون vunreblity داشته باشن و باید طوری طراحی کنیم که قابل اضافه کردن هم باشه یعنی بره از یه دیتابیسی بخونه

سرویسی ها میتونن این کار ها رو انجام بدن و میخواین این مسوئولیت ها رو از middleware به service ها ببریم

این رو از middleware میبریم توی service

خوب حالا مثلا این رو ساختیم ، چجوری ازش استفاده کنیم :

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

الگوی لایه بندی سنتی

یه لایه ای داریم که توی .net میشه همون namespace که اون هم میتونه توی یه assembly مستقل باشه یا توی یه dll باشه

خوب اینجا داره میگه که policy layer میتونه از امکانت mechanisim layer استفاده کنه و …

این یعنی این که توی polciy layer یه کلاسی هست که میتونه از یه کلاسی توی mechenesim layer استفاده کنه

یه لایه middleware داریم و لایه services

هر namesapce معادل یک لایه هستش

الان browser check middleware داره از لایه services استفاده میکنه چون که browser check service توی لایه ی services هستش

بدی این کار اینه که الان این دو تا کلاس بهم وصل شدن و وابسته حالا چند مدل dependency داریم : ساختاری و رفتاری

رفتاری مثل همین مثال قبل

ساختاری میشه اینطوری :

اینجا چون ورودی از نوع http context هستش ، یعنی این که invoke async به http context وابسته شده

خوب روش های جدید اینطوریه که policy layer میاد و نیازمندی های خودش رو در قالب interface تعیین میکنه و لایه پایین دست که mechanisim layer هستش برای این که به لایه بالاتر سرویس بده میاد اون قرارداد ها رو پیاده سازی میکنه

خوب این فلش رو به بالا یعنی این قرارداد رو پیاده سازی میکنه فلش سمت چپی یعنی این که این قرارداد رو تعریف میکنه

اسمش رو میتونیم contract یا interfaces بزاریم

خوب حالا میخوایم ازش استفاده کنیم :

خوب حالا با توجه به اون ساختار فولدر بندی و لایه بندی بالا میفهمیم که دیگه ما توی این حالت توی middleware ها نیازی به یک لایه دیگه یا همون لایه service نداریم و اومدیم هر چی لازم داشتیم رو توی همون لایه یا همون middleware تعریف کردیم

خوب حالا میخوایم ازش استفاده کنیم : یه راهش اینه که بیایم توی constructr ازش new بگیریم و ازش استفاده کنیم

خوب فرض رو بر این بزاریم که میخوایم از یه lib کمک بگیریم برای انجام یه کاری ، به طور مثال اینجا مثلا اون کاره ساختن browser check service هستش

خوب حالا هر جایی که هر کسی بخواد از browser check service بیاد و new کنه بهش dependency پیدا میکنه

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

خوب این قضیه میتونه برای بقیه سرویس ها هم تکرار بشه مثل همون XYZ که کامنت شده

خوب این کار رو کردیم که وقتی که خواستتیم از یه service استفاده کنیم و اون رو بسازیم و استفاده کنیم همه اون ها یه جا باشن و اگر به طور مثال چند تا کلاس داشتیم که همه شون به هم وصل شده بودن کدمون بهم ریخته نشه

خیلی جالبه چون جلوتر از mediator برای پیاده سازی این کار داریم استفاده میکنیم (فکر کنم )

اینجا service factory نقش ioc رو داره

خوب حالا اینجا اینطوری میشه که هر کسی بخواد هر جایی instance بسازه باید از service factory استفاده کنه

خوب حالا مثلا میخوایم browser check service مون یه ورژن دیگه استفاده کنیم برای این کار فقط میایم مثلا یه کلاس جدید میسازیم اسمش رو میزاریم new browser check service و بعد به جای این که بریم توی برنامه و هر جایی که از ورژن قدیمی استفاده شده بود رو تغییرش بدیم به اسم این جدیده ، فقط یه جای توی factory service عوض میکنیم و همه چی آپدیت میشه

اینطوری

هر چقدر که cupeling بین کلاس ها رو کم کنیم cupling بین لایه ها هم کمتر میشه

خوب حالا یه تکنیک به اسم factory degin داریم اونم اینه که ما میایم توی service factory میگیم که بیاد اون کلاسی که میخوایم رو از قبل بسازه و آماده نگه اش داره و هر که خواستش بده بهش یعنی کل برنامه فقط یا یه instance از اون object یا کلاس کار کنه

اینطوری

اینطوری میشه singlethon

حالا خوب ما شاید یه جایی بخوایم چند تا بسازیم از یه شی ، و یه جا هم نه همون یدونه باشه ، برای این کار از service locator pattern استفاده میکنیم

خوب بعدش برنامه نویس ها درگیر میشدن با این بخوان life cycle برای شی ها درست کنن و کلی وقت گیر بود برای همین دست اخر میرسن به پترن dependecy injection

خوب dependency injection خودش یه جورایی ioc هستش ، یعنی میخواید کلاس رو درست کنه برای استفاده

خوب حالا اگر بتونه life cycle هم انجام بده دیگه یه چیزی فراتر از همه ی اینهاست

خوب این پترن داره میگه که هر چیزی که dependecy ایجاد میکنه از طریق constructor ایحادش کن

توی این حالت هم ما به service factory وابسته هستیم و میخوایم حذفش کنیم (این توی حالت قبلی بود )

به این کد بالا میگن constructor injection

خوب حالا نکته ی جالب اینه که ، ما حالا میخوایم اینجا این کلاسه توی consttructor گرفته بشه و استفاده بشه ولی نکته اش اینجاست که حالا این کلاسه رو کجا بسازیم ؟

نکته ی خیلی مهم :

خوب اگر از مباحث قبل یادمون باشه اینه که وقتی که توی program از builder استفاده کردیم میتونیم از service هم استفاده کنیم

خوب داخل builder یه چیزی هست به اسم service که اون خودش از یه اینترفیس به اسم Iservice Collection استفاده میکنه

خوب این یعنی چی ؟ یعنی این که براش فرقی نداره این سرویس ها چی هستن ، میگه که مجموع تمام سرویس هایی که قراره توی برنامه استفاده بشن رو بده بیاد

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

خوب این اینترفیس Iservice ِه سری قابلیت به ما میده

یکیش

خوب اینطوری ازش استفاده میکننیم اول این که interface رو میزاریم و بعد پیاده سازیش رو میاریم :

که میشه service definithion , service implimitation میشه

که این دو تا توی یک لایه نیستند

میشه گفت که محل تلاقی interface ها با پیاده سازی که در این تصوریه IService هستش

خوب به تعبیر دیگه Iservice میشه dependency injection ما توی .net

خوب transent اینطوریه که هرکسی هر موقعی از این instance بخواید یدونه جدید میسازه بهش میده

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

قبلا برای پیاده سازی پترن singlethon باید کلی کار میکردیم الان با همین کارمون اوکی میشه

خوب scope

هر چرخش یا گردش توی این عکسه ، میشه یه scope

یعنی request بیاد و به response برسه

خوب جالا فرقش با transent چیه ؟ اینه که مثلا middlewar 1 میگه من از اون سرویسه میخوام ، یدونه ساخته میشه و بهش میده ، حالا در مرحله ی بعد middleware 2 هم میگه من از اون سرویسه میخوام دوباره یکی دیگه ازش ساخته میشه بهش داده میشه

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

خوب در حالتی که از scope استفاده کردیم ،

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

خوب یه قابلیتی که dependency injection داره اینه که اون کلاسی که میخوایم توش یه سرویسی رو inject کنیم باید توی constructor و فیلدهاش به صورت واضح همه چیو نمایش بده و خودده کلاس حق نداره از خودش چیزی بسازه هر چیزی که میخواد رو توی constrcutor وارد شده باشه که بتونه ازش استفاده کنه

ما با نگاه کردن constructor میفهیم که این کلاس به کجا ها وصله

135

46:34

اصل امنیت همه جا یکسان هستش ، یه اصلی هستش به اسم least privilage

خوب این validate قراره یه چیزی رو بخونه و بعد چکش کنه قرار نیست که تغییری رو ایجاد کنه

خوب اینجا اتفاقی که میوفته اینه که ما میخواستیم فقط چک کنیم که این browser از نوع fire fox هست یا خیر ولی اومدیم کل اطلاعات و بالاترین سطح دستری اطلاعات که http context هست رو داریم بهش میدیم

برای این که بهترش کنیم میایم فقط user agent رو بهش میدیم

خوب بعد از این که این تغییر رو ایجاد کردیم باید بریم هم توی browser check service پیاده سازیش کنیم و هم توی new browser check service پیاده سازیش کنیم

خوب توی این ورژن جدید میایم از header ها فقط اونی رو میخوایم رو برمیداریم و میفرستیم برای چک کردن ، اینطوری :

غذای کم نمک رو میشه بیشتر بهش نمک زد ولی عذای شور رو نمیشه هیچ کاری کرد.

خوب حالا اگر بخوایم یه ورژن خاص از edge رو بلاک کنیم :

خوب اگر بخوایم کد رو باز کنیم و از بیخ تغییر بدیم این کار خوبی نیست

برای این که بدونیم راه درستش چیه باید configuation اش رو درست پیاده سازی کنیم

یه بخشی که میتونیم تنظیمات رو پیاده سازی کنیم اینجاست :

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

خوب حالا داستانی که داره اینه که وقتی که service راه افتاد میاد اطلاعات رو از اینجا برمیداره و استفاده میکنه و دیگه نمیتونیم تغییرش بدیم

خوب مرحله ی بعدی setting هستش

یعنی بعد از lunch setting بعشد میرسه به app setting

خوب به طور مثال این تنظیمات که نوشتیم برای چک کردن browser رو یه service داره ازش استفاده میکنه و کل application نمیخواد ازش استفاده کنه ، برای همین میزارمیش توی appsetting

یعنی lucnch setting برای کل application هستش

حالا میایم یه appsetting production هم درست میکنیم

این جا برای محیط development هستش

خوب به جایی که نه توی محیط dev هست و نه production بهش میگن stage

خوب حالا خوده asp میاد و این تنظیمات رو merge میکنه ولی اولویت اون هایی که مشخصا محیطشون تعریف شده مثل appsetting dot development اولویتش بالاتره و اگر دو تا تنظیمات برای یه سرویس نوشته باشیم یکی توی app setting و یکی توی appseting dev اونی که روی app setting dev هستش میاد و over write میشه روی اون یکی

خوب توی این مثال اینطوریه که ما توی محیط dev جلوی هیچ مرورگری رو نمیخوایم بگیریم ولی توی محیط production میخوایم محدودیت ایجاد کنیم

یه سری سرویس هستش که built in خوده asp هستش که میتونیم مثل سرویس ها بیایم و توی کلاس ها inject کنیم و ازشون استفاده کنیم

مثل IConfiguration

خوب حالا اینجا از configuration اومدیم یه متد get value استفاده کردیم بعدش گفتیم نوع تنظیماتی که میخوایم بگیریم از نوع string هستش و بعد هم تعیین کردیم که کدوم فیلد رو میخوایم

خوب توی کد بالا اومدیم اصلا از بیخ یه تنظیمات جدید درست کردیم و اسمش هم گذاشتیم http prod

خوب حالا یه داستانی هست اینجا middle ware ما در هر حال اجرا میشه

ولی خوب ما میخوایم توی محیط dev اصلا چک نشه و اجرا نشه

خوب برای حل این قضیه یه راهی هست میتونیم از app dot enviroment استفاده کنیم

خوب حالا اگر بخوایم از برنامه تنظیمات رو بخونیم و بریزیم توی دیتا بیس

خوب فرض کنید که اون XYZ یه رمزه که توی محیط prod تولید میشه و ادمین نمیخواد که هیچ کسی اینو بدونه

خوب اینطوری خوب نیست چون این رمز ها توی دیتابیس ذخیره میشن

حالا اگر بتونیم تنظیمات رو طوری تعیین کنیم که فقط همون هایی که قراره استفاده بشن ، اونجا نوشته بشه

اینجا یه پترنی به اسم option pattern میاد

حالا اومدیم browser رو به صورت یه آبجکت نوشتیمش ، اینطوری وقتی که صورت json مینویسیم میشه section اسمش

اگر اینطوری نباشه میگیم value هستش

بعد میایم اینطوری ازش استفاده میکنیم : از Ioption استفاده میکنیم که اینترفس خوده .net هستش

خوب ما اومدم از option dot value استفاده کردیم ، خوب value اینجا یعنی چی ؟ خوب ایجا interface اون آبجکت رو اینجکت میکنیم و بعد مقادیر رو میگیریم

خوب حالا باید ریفکتور کنیم چون دیگه نمیخوایم از configuration استفاده کنیم :

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

اینطوری اسم گذاری بهتری داره :

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

خوب یه راه اضافه کردن در program اینطوریه : اینجوری میشه inline

حالا استفاده از setting : یا همون appsetting

خوب حالا میخوایم به option مقدار بدیم ، چجوری؟ اینجور که خوب builder به فایل ها دسترسی داره میگیم که builder برو توی configuration ها و اونجا یه section که عنوانش browser هست رو بیار و با bind داریم میگیم که یه آبجکت از نوع browser check option بهم بده که اینهایی که از configuration اوردم رو بریزم توی اون کلاس

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

مثلا اینجا اومدیم تایم هم بهش دادیم

end