Code dự án .NET Microservice (P1)
Why Microservice?
Microservices là gì? Sử dụng Microservices có những ưu điểm gì? Tại sao chúng ta nên sử dụng microservices?
Có thể độc lập deploy
- Nếu một dự án có nhiều microservice, chúng ta có thể đang làm việc trên một microservice lúc này hoặc có thể có khả năng .......và cá nhân họ có thể độc lập deploy thay vì chỉ có thể deploy khi dự án đã hoàn thành với tất cả microserivce.
Do đó, với mcsv chúng ta không cần phải phụ thuộc vào các phần khác của ứng dụng, chúng ta có thể làm việc trên mỗi mcsv cá nhân và mỗi mcsv lại có thể độc lập deploy.
Independently Scalable
- Mcsv là vô cùng hữu ích khi chúng ta muốn mở rộng (scale) dự án.
- Với kiến trúc monolithic, chúng ta thường có 1 server và chúng ta phải
Coding
Tạo project
Tạo một solution cho dự án của chúng ta với một project ASP.NET Core Web API có tên là Mango.Services.CouponAPI
Coupon API endpoint
Tạo một folder Models
Tạo class Coupon với các thuộc tính:
public class Coupon{ public int CounponId { get; set; } public string? CouponCode { get; set; } public double DiscountAmount { get; set; } public int MinAmount { get; set; } }
Tạo DBContext
Tạo folder Data
Tạo file AppDbContext nằm trong folder Data
AppDbContext sẽ implement class DBContext - một class trong package Microsoft.EntityFramework.Core
Viết code....
Thêm annotation cho class Coupon
Chỉnh sửa file appsettings.json (nếu chưa có)
Tạo file appsettings.json (nếu chưa có)
Thêm .... cho DB của chúng ta
Tạo database
Thêm service để cấu hình cho DbContext bên trong file Program.cs
Ở đây chúng ta đang theo hướng Code First nên chúng ta sẽ migration DB. Có 2 cách để migration:
Sử dụng Package Manager Console
add-migration AddCouponToDb update-database
- Sử dụng Terminal
Tạo API Controller
Tạo một APIController trong folder Controllers
Chúng ta sử dụng Entity Framework Core để truy cập tới DB, do đó chúng ta sẽ sử dụng class AppDbContext thông qua DI
Khai bao method Get tương ứng với route để lấy ra list coupon từ DB
Khai báo method Get thứ 2 nhận vào một id và trả về Coupon tương ứng với id đó
Chúng ta cần phải có .... để phân biệt được các endpoint trong cùng một kiểu method
[HttpGet] [Route("{id:int}")] //cach khac [HttpGet("{id:ind}")]
Tạo folder DTO trong folder Models
Tạo class CouponDTO
- Khi ai đó truy cập tới một coupon, chúng ta không muốn pass hết tất cả các trường. For that, trong một API thường không trả về một đối tượng hoàn chỉnh với các trường trong DB
-> Do đó, chúng tạo ra một class DTO (Data Transfer Object) có các properties mà chúng ta muốn show ra ngoài.
Chúng ta thường có 2 cách để map một đối tượng thường sang DTO và ngược lại
Thủ công
Sử dụng package (trong project này chúng ta sử dụng AutoMapper - đây cũng là package được sử dụng phổ biến)
Cài đặt package
AutoMapper
AutoMapper.Extensions.Microsoft.DependencyInjection
Tạo một file MappingConfig.cs
AutoMapper hỗ trợ chúng ta mapping tự động miễn là property name class thường và class DTO là giống nhau.
public static MapperConfiguration RegisterMaps() { var mappingConfig = new MapperConfiguration(config => { config.CreateMap<Counpon, CouponDTO>().ReverseMap(); }); }
Ở đây, class CouponDTO sẽ được mapping với class Coupon với các properties tương ứng cùng tên.
Để mapping ngược lại từ class DTO sang class thường, chúng ta có thể tiếp tục
CreateMap<CounponDTO, Coupon>
hoặc ở đây chúng ta có thể dùng luôn phương thứcReverseMap()
.- Đăng kí service cho MappingConfig trong Program.cs
Sau khi đã đăng kí service, chúng ta inject AutoMapper vào controller của chúng ta bằng cách sử dụng Dependency Injection (DI)
Ví dụ: