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?

  1. 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.

  2. 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

  1. Tạo một folder Models

  2. 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; }
     }
    
  3. Tạo DBContext

    1. Tạo folder Data

    2. Tạo file AppDbContext nằm trong folder Data

    3. AppDbContext sẽ implement class DBContext - một class trong package Microsoft.EntityFramework.Core

    4. Viết code....

  4. Thêm annotation cho class Coupon

  5. Chỉnh sửa file appsettings.json (nếu chưa có)

    1. Tạo file appsettings.json (nếu chưa có)

    2. Thêm .... cho DB của chúng ta

  6. 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:

      1. Sử dụng Package Manager Console

           add-migration AddCouponToDb
           update-database
        
        1. Sử dụng Terminal
  7. 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}")]
        
  8. Tạo folder DTO trong folder Models

  9. 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)

        1. Cài đặt package

          AutoMapper

          AutoMapper.Extensions.Microsoft.DependencyInjection

        2. 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ức ReverseMap().

      1. Đă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ụ: