ساخت یک Microservice با NET 5.
This video shows how to create a microservice from scratch using .NET 5. You will learn:
• How to create a .NET 5 microservice from scratch
• Build and debug a .NET 5 project in VS Code
• Interact with your microservice endpoints via Open API and Postman
• Keep configuration and secrets separate from your service code
• Simplify http requests to external endpoints
• Deal with transient errors on external services
• Report the health of the service and its dependencies
• Produce logs suited for a microservice environment
مقایسه Angular vs. React vs. Vue
If you love TypeScript: Angular or React
If you love object-orientated-programming (OOP): Angular
If you need guidance, structure and a helping hand: Angular
If you like flexibility: React
If you love big ecosystems: React
If you like choosing among dozens of packages: React
If you love JS & the “everything-is-Javascript-approach”: React
If you like really clean code: Vue
If you want the easiest learning curve: Vue
If you want the most lightweight framework: Vue
If you want separation of concerns in one file: Vue
If you are working alone or have a small team: Vue or React
If your app tends to get really large: Angular or React
If you want to build an app with react-native: React
If you want to have a lot of developers in the pool: Angular or React
If you work with designers and need clean HTML files: Angular or Vue
If you like Vue but are afraid of the limited ecosystem: React
If you can’t decide, first learn React, then Vue, then Angular
مزیت استفاده از روش webpack، امکان تعریف یک چنین آدرس دهیهایی است جهت یکی کردن فایلهای html با فایل bundle نهایی:
template: require('./app.component.html'),
در این حالت وظیفهی tsc به شکل زیر درخواهد آمد:
var embedTemplates = require('gulp-angular-embed-templates'); gulp.task("tsc", () => { var tsProject = tsc.createProject("./tsconfig.json"); var tsResult = gulp.src([appFolder + "/**/*.ts"]) .pipe(embedTemplates({ debug: true, basePath: "./", sourceType: "ts", minimize: { empty: true, spare: true, quotes: true, dom: { xmlMode: true, lowerCaseAttributeNames: false, lowerCaseTags: false } } })) // inline templates .pipe(tsc(tsProject), undefined, tsc.reporter.fullReporter()); return tsResult.js.pipe(gulp.dest(appFolder)); });
TypeScript 4.4 منتشر شد
Some major highlights of TypeScript 4.4 are:
Control Flow Analysis of Aliased Conditions and Discriminants
Symbol and Template String Pattern Index Signatures
Defaulting to the unknown Type in Catch Variables (--useUnknownInCatchVariables)
Exact Optional Property Types (--exactOptionalPropertyTypes)
Class static Blocks
tsc --help Updates and Improvements
Performance Improvements
Spelling Suggestions for JavaScript
Inlay Hints
Breaking Changes
TypeScript 4.0 Beta منتشر شد
Now let’s take a look at what’s in store for TypeScript 4.0!
Variadic Tuple Types
Labeled Tuple Elements
Class Property Inference from Constructors
Short-Circuiting Assignment Operators
unknown on catch Clauses
Custom JSX Factories
Speed Improvements in build mode with --noEmitOnError
--incremental with --noEmit
Editor Improvements
/** @deprecated */ Support
Partial Editing Mode at Startup
Smarter Auto-Imports
Breaking Changes
دریافت و نصب پیشنیازها
برای نمایش loading bar در بالای صفحه، از کامپوننت ng2-slim-loading-bar استفاده خواهیم کرد. دمویی از آنرا در اینجا میتوانید مشاهده کنید.
برای نصب آن، ابتدا دستور ذیل را در ریشهی پروژه اجرا کنید:
npm install ng2-slim-loading-bar --save
"styles": [ "../node_modules/ng2-slim-loading-bar/style.css", "styles.css" ],
import {SlimLoadingBarModule} from 'ng2-slim-loading-bar'; @NgModule({ imports: [ //... SlimLoadingBarModule.forRoot() ] }) export class AppModule { }
پس از این مقدمات، هرجایی که نیاز به استفادهی از آن با کدنویسی باشد، ابتدا سرویس SlimLoadingBarService آنرا به سازندهی کلاس کامپوننت مدنظر تزریق میکنیم و سپس از متدهای start ،stop و complete آن میتوان استفاده کرد.
import {SlimLoadingBarService} from 'ng2-slim-loading-bar';
<ng2-slim-loading-bar></ng2-slim-loading-bar>
تدارک یک LoaderInterceptor برای استفاده از ng2-slim-loading-bar
در ادامه میخواهیم هر زمانیکه در سراسر برنامه، درخواست HTTP ایی شروع شد، این کامپوننت نمایش داده شود و در پایان درخواست و یا درصورت بروز خطایی، پایان یابد و مخفی شود. برای این منظور یک Interceptor جدید را به صورت ذیل به پوشهی Core برنامه اضافه میکنیم:
ng g s core/interceptors/LoaderInterceptor --spec false
import { Injectable } from "@angular/core"; import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from "@angular/common/http"; import { Observable } from "rxjs/Observable"; import "rxjs/add/operator/do"; import { SlimLoadingBarService } from "ng2-slim-loading-bar"; @Injectable() export class LoaderInterceptorService implements HttpInterceptor { constructor(private loadingBar: SlimLoadingBarService) { } intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { // start our loader here this.loadingBar.start(); return next.handle(req).do( (event: HttpEvent<any>) => { if (event instanceof HttpResponse) { this.loadingBar.complete(); } }, (err: any) => { this.loadingBar.complete(); }); } }
- برای پیاده سازی یک interceptor جدید، نیاز است کلاس سرویسی را که HttpInterceptor را پیاده سازی میکند، ایجاد کنیم. برای تکمیل این پیاده سازی نیاز است متد intercept را با امضایی که مشاهده میکنید، تعریف کنیم:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
- کار پارامتر next تنظیم و بازگشت یک HttpEvent observable توسط متد handle آن است.
برای نمونه در اینجا ابتدا سرویس SlimLoadingBarService به سازندهی کلاس interceptor تزریق شدهاست. سپس توسط آن میتوان به متدهای start و complete این کامپوننت دسترسی یافت. برای مثال در ابتدای کار گوش فرادادن به درخواست جاری، متد start فراخوانی شدهاست و سپس زمانیکه پاسخی از سرور دریافت شده و یا خطایی رخداده، متد complete آن فراخوانی شدهاست.
ثبت و معرفی LoaderInterceptorService به سیستم
برای معرفی interceptor تهیه شده، به فایل app.module.ts مراجعه کرد و قسمت providers آنرا به نحو ذیل تکمیل میکنیم:
@NgModule({ providers: [ { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptorService, multi: true } ] }) export class AppModule {}
آزمایش برنامه
اکنون اگر قسمتهای مختلف برنامه را که با HttpClient جدید کار میکنند بررسی کنید، متوجه خواهید شد که با شروع هر درخواست، loading bar قرمزی در بالای صفحه ظاهر میشود و در پایان درخواست، به صورت خودکار مخفی میگردد. نکتهی مهم این روش عدم نیاز به تغییری در قسمتهای مختلف برنامه است. این interceptor سراسری است و به صورت یکسانی بر روی کل برنامه تاثیر میگذارد.
urlSearchParams.append('grant_type', 'refresh_token'); urlSearchParams.append('refresh_token', model.refreshToken);