ساخت پروژه dotnet new

اینجا داره میگه که نوع پروژه Web هستش که با o داریم میگیم بهمون خروجی بده و اسمش هم app1 هستش

دستور اینطوری میزنیم C:\Users\Soheil\Desktop\blazorPrj> dotnet new web -o App1

برای اجرای پروژه میایم با cd میریم داخل فولدرش و با دستور code . اون رو اجرا میکنیم

اولش میایم برای اجزایی شدن کد هامون build اش میکنیم

بعد میایم میزنیم dotnet run

برای این که ارور

The type or namespace name ‘AspNetCore’ does not exist in the namespace ‘Microsoft’ (are you missing an assembly reference?)

برای رفع ارور:

  • dotnet add package Microsoft.AspNetCore

میایم و obj رو حذف میکنیم که بیاد و توی explore ظاهر بشه

خوب حالا اینجا میایم implicit using میاد این رو میگه که وقتی که این رو enanle میکنیم این میاید یه سری از using ها رو به صورت global اعمال میکنه :

وقتی که disable اش میکنیم :

به ارور میخوریم

اکشتنشن های خوب

code —install-extension SonarSource.sonarlint-vscode

اینجا حالا میایم explicit usig میکنیم :

یعنی مستقیما بنویسیم

این شکلی هم میتونیم از اون using ها استفاده کنیم : وقتی که این کار رو انجام میدیم اون فایل global تغییر میکنه و اون های دیگه که داخلش بودن پاک میشن

خوب حالا میتونیم کلا به صورت manual بیایم خودمون یه کلاس درست کنیم و این کار رو بکنیم : خودمون کلاس global using رو درست کردیم

با اکشتنشن better comment این کار رو میتونیم انجام بدیم :

خوب حالا create builder که داریم درسته که ازش ساخته نشده ولی میتونیم ازش استفاده کنیم ، توی این حالت یعنی این که اون static هستش و public

خوب حالا وظیفه ی این builder درست کردن servic هامون هستش

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

از یه راه دیگه هم میتونیم این کار رو بکنیم اونم استفاده از Create هستش ولی وفتی که از create استفاده میکنیم ، خودش همونطوری که نوشته شده میره args رو میگیره و میده به web application و یک خط رو حذف کردیم با استفاده از create ولی یه سری قابلیت هم باهاش حذف شده

خوب create وصل میشه به factory

خوب این Args یعنی چی ؟ یعنی این که اینجا میتونیم یه سری چیزهایی رو به صورت ورودی بدیم برای تنظیمات ساخت web application

حااالا این آرگومان ها میتونه توی cli باشه یا توی setting باشه

این create که داره میاد از factory design pattern داره استفاده میکنه

خوب اینجا اومده توضیح داده به طور مثال اینجا اومده چیزهایی که مشترک هستش رو توی کلاس والد قرار داده که به طور مثال اینجا میشه برنامه ریزی برای تحویل بار plan delivery و create transport رو میایم رزو میکنیم برای استفاده بعدی

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

متد abstract چیه ؟ متدی که توی کلاس والد مینویسیمش و در کلاس های فرزند پیاده سازیش انجام میشه

خوب با متدی که توی اون کلاس هست میایم و یه transport یا بارنامه تولید میکنه

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

تایم 1:13:29 جلسه 1

وقتی که میخوایم سرویس رو run کنیم با dotnet run

خوب ما وقتی که میخوایم یه پارامتری رو تعریف کنیم میایم اون رو با استیل kebab case تعریفش میکنیم حالا وقتی که میخوایم یه پارامتری رو از خارج پروژه بیاریم داخلش از double dash استفاده میکنیم —

خوب حالا این کاری که اینجا کردیم و این پارامتر رو زدیم این پارامتر میره توی args قرار میگیره که اون هم میاد create ازش استفاده میکنه و web application رو میاد config میکنه

توی قسمت بالا میخوایم یه دیتا بیس برای پروژمون در نظر بگیریم

در ابتدا برای شروع پروژه میاد فایل lunch setting رو اطلاعاتش رو برمیداره و اون چیزهایی هم که ما دادیم بهش رو هم میگیره و میزاره توی args و بعد اجرا میکنه

نمیدونم که آیا همه رو میبره توی args یا فقط ورودی که بهش دادیم ؟

خوب app وقتی که ساخته میشه یه سری اجزایی داره یکی از از این اجزا logger اش هست که بعدش میتونیم از log information استغاده کنیم

خوب بعدش میخوایم یه سری چیزهایی که توی app setting هستش رو بخونیم و ازشون لاگ بگیریم برای همین میایم از این خط بالا استفاده میکنیم

خوب اینجا میاذ logger رو میسازه configuration رو میسازه و … موارد دیگه ، میتونه خیلی چیزهای دیگه بسازه و اینجاست که داریم میگیم که از design pattern factory استفاده شده و ما هر چی که بخوایم رو میتونیم درست کنیم که توی این مثال با استفاده از create داره انجام میشه

خوب اینجا توی خط آخر ما میخوایم اون مقداری که توی ورودی Args بهش دادیم رو بخونیم

این 3 تایی که این بالا نوشته شده رو برامون میاره که میشه همون log هایی که میخواستیم

کلا ما هر چی که برای برنامه مون نوشته باشیم همش میره توی web application و بعد در آخرش که run میشه ، اجرا میشن

جلسه دوم :

خوب میرسیم به end point یعنی از اونجا باید سرویس دهی رو شروع کنیم و این سرویس دهی قطعا یه سری شرایط داره ، پروتکل ، معماری ها و روش های متنوعی وجود داره ولی معماری rest رو میخوایم انتخاب کنیم :

سمت راست عکس یه وب اپ هستش که یه سری req میفرسته که یه سری res رو دریافت کنه خوب این درخواست ها از سمت clinet میخواد بره سمت web server خوب rest رو مخفف نوشته شده ویژگی های rest : یک استایل معماری هستش برای فراهم کردن یک استاندارد بین کامپیوتر ها در web تا ارتباط بینشون تسهیل بکنه

سیستم ها که منطبق بر این استاندارد هستند ، اسمشون رو میزاریم سیستم های restfull

ویژگی های معماری rest : ما معماری شبکه داریم : TCP

خوب client و sever باید از هم جدا باشند ، به دلیل جدا سازی دقدقه ها این به این معنی هستش که یعنی در سمت clinet چیزی که مهم هستش اینه که ظاهر سایت مناسب و قشنگ باشه ولی در backent و server دقدقه ی امنیت داریم

به همین دلیل هم هست که معماری MVC کنار گذاشته شد چون این ها همه با هم بودند مورد بعدی stateless هستش ، یعنی هر کدوم از سرویس ها وقتی که درخواستی بهشون زده میشه دیگه چیزی در خاطرشون نمیمونه و هر درخواست با اون پاسخی که ارسال میشه تموم میشه و client نمیتونه بگه که در درخواست قبلی مثلا فلان کار رو کردم ادامه ی اون رو برم یا از این قبیل موارد

این معماری ها حافظه ندارند اگر این موضوع رو رعایت نکنیم برای موارد پیاده سازی ها امنیت به مشکل میخوریم مثلا به طور مثال همون فرآیند Login کردن

به طور مثال وقتی که ما login هم میکنیم باز هم برای هر درخواست باید احراز هویت بشیم

ویزگی بعدی اینه که قابلیت cache دارند ، به طور مثال اگر ما یه بار یه درخواستی بزنیم و یه سری اطلاعات رو از دیتابیس بگیرم در بار بعدی که همون درخواست رو میزنیم این درخواست سریع تر اجرا میشه ، ما میایم حاصل پردازش ها و درخواست ها رو یه جایی ذخیره میکنیم تا بعدا بتونیم ازش استفاده کنیم

ویژگی بعدی layered system

اون فضای ابری که توی عکس بالاست و ارتباط بین client و server هستش معماره لایه بندی داره مثل proxy , load balancer

واسط یکسان uniforn interface

خوب درخواستمون باید یه uniqe resorse identifer داشته باشه که شامل Path , method , parametes , headers هستش

مسیر ، روش ، پارامتر ها ، headers

درخواست ها چیزی دارند به اسم URI که یعنی Uniqe resourse identifier

خوب response هم میشه پاسخ سرور : که شامل content type , body payload , response status هستش

خوب مثلا content type میشه این که لیست محصولات رو چجوری بخوایم تهیه کنیم و بفرستیم json , excel , csv , … و حالت های دیگه ، مورد بعدی payload هستش که یه سری اطلاعات هم برای استفاده کردن از همون content type هستش و مورد بعدی هم response status هستش که میشه سرانجام اون پاسخ

پروژه جدید میزنیم :

خوب حالا یه سری میایم تغییرات ایجاد میکنیم : اولیش این که میایم lunch brower رو false میکنیم و application url رو میزاریم روی locacl host 5000

حالا داستان اون lucnch broower اینه که وقتی که سرویس اجرا میشه میاد defualt brower v رو هم باهاش اجرای میکنه و اگر به ازای هر بار اجرای پروژه بخواد یه briwer رو باز کنه خیلی بهم ریخته میشه

در بخش دوم هم اومدیم http رو پاک کردیم و local host رو گذاشتیم روی 5001

دیفالت روی http هستش ولی میخوایم بزاریمش روی https

اینجا یک ssl ساخته شده به صورت development

این همون ssl ای هستش که قرار میگیره اونجا هم domian نوشته شده که local host هستش خوب اینجا expiration date هم هستش که وقتی که اعتبارش تموم بشه خوده دات نت میاد به روز رسانیش رو انجام میده

اینجا هم نوشته شده که برای develpment هستش و قابلیت این که ببریم روی سرور رو نداره

مپ کن درخواست های get رو ، که توی ورودیش یک pattern داره یه delegate

خوب توی فیلد اول که pattern هستش داریم به طور مثال path رو مینویسیم

دقیقه 40

میرسیم به توضیح delegate:

خوب به قسمتی که highlight شده میگن امضا متد یا sinuture method

خوب این متد وقتی که ورودی number داشته باشه و خروجی string ، این امضا داره به تمامی متد هایی که این شرایط ورودی و خروجی رو دارند داره اشاره میکنه مثلا process 2 میشه یه مثال

خوب حالا برمیگردیم به map get این یعنی این که درخواست هایی که قراره دریافت که باید از نوع get باشند

تایم 47

خوب توی rest میگه path ولی توی .net داریم pattern و بخش دوم داره میگه که اشاره میکنه به متدی که میخواد یه کار اجرایی میخواد انجام بده

دومین بخش میشه handler این یعنی این که اگر کسی روی این آدرس درخواست کرد بیاد handle اش کنه و یه سری پردازش رو انجام بده

حالا اینجا اون قسمت handler اینطوریه که یک متد رو بر اساس lamda expression پیاده سازی کرده که ورودی هیچی نداره ولی خروجی داره hello word میده

با کلید های control + R پروژه rebuld میشه

خوب حالا این چیزی که اینجا نوشته دقیقا با اونی که توی پاور پوینت بود یکیه :

خوب URI با URL تفاوت داره , و URL میشه همون path و URI میشه کل اون فیلد ها

خوب توی user agent داره میگه که این درخواست از چه نوع مرورگری ارسال شده

تمامی آدرس هایی که توی بروزر میزنم از نوع get هستند

خوب حالا این رو در نظر بگیرید که بخوایم برای هر پروفایل یک مسیر رو در نظر بگیریم :

** میشه این تصویر پایین

خوب برای تست end point ها توی vs code میایم اکستنشن Thunder clinet رو روش نصب میکنیم

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

اگر با هیچ کدوم از اون مسیر ها اجرا نشد ، این اروور رو میده

1:12

اگر با مسیر های بالاتر match بشه اون رو نشون میده

محل تامین paramiter ها میتونه section باشه

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

خوب حالا اگر بخوایم از طریق قسمت dynamic اون مقادیر رو بگیریم از from route استفاده میکنیم

اگر این attribute ها رو هم نزاریم باز هم .net میفهمه و انتقال رو انجام میده ولی برای درست کردن داکیومت استفاده میشه

1:35

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

ما اینجا اومدیم توی handler مون در ورودیش product id رو دادیم و در هندلر اومدیم یک product رو درست کردیم و بهش مقدار دادیم

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

خوب اینجا پاسخی که داره بهمون برمیگدونه با فرمت json هستش این یعنی این که content type دات نت از نوع json هستش

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

خوب اینجا داریم میگه که اگر id منفی بوده قبل از این درخواست ارسال بشه دیتا بیس خوده برنامه بهش ارور bad request بده

1:44

چون ما داریم یه کلاس رو برمیگردونیم بهتره که از typed result استفاده کنیم

خوب این که client type چیه ، اینه که مثلا سمت کلاینت blzor , angulat, html یا چی هستش ؟ اینجا فرم های ساده html رو داریم که میخواد با api ها ارتباط برقرار کنه

خوب نکته ای که اینجا هست اینه که آدرسی که داریم چیزی اضافه نمیشه توی این حالت برای ارسال اطلاعات بلکه این اطلاعات از طریق form field ها انجام میشه

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

بعد پاسخی که میگیریم این هستش :

خوب حالا میخوایم login رو از طریق blazor ارسال کنیم ، خوب توی فرانت های جدید این ها قابلیت این رو دارند که خودشون اطلاعات رو به صورت json تبدیل کنند و ارسال کنند :

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

خوب حالا اگر بخوایم json رو توی payload بفرستیم اونور باید تعریف کنیم که بیاد اطلاعات رو از body بگیره و بعد اون کلاسی که درست کردیم و قراره اون json رو بگیره 2:07

از نسخه ی async میایم استفاده میکنیم برای run حالا میخوایم put رو بنویسیم :

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

حالا end point برای پاک کردن :

خوب status code

اگر اروری که میگیرم از نوع 4 باشه یعنی سمت کلاینت هستش

خطاهایی که با 5 شروع میشه از سمت backend هستش