ASP.NET Core Learning

The basics of ASP.NET Core [EP1/2]

ASP.NET Core มีปัจจัยพื้นฐานที่สำคัญที่ควรมุ่งเน้นเพื่อให้เราเข้าใจและนำไปใช้ในการพัฒนาโปรแกรมอย่างมีประสิทธิภาพ

the basics of ASP.NET Core
Ake SuwaphanAke Suwaphan
03 March 2024

The basics of ASP.NET Core [EP1/2]

ASP.NET Core มีปัจจัยพื้นฐานที่สำคัญที่ควรมุ่งเน้นเพื่อให้เราเข้าใจและนำไปใช้ในการพัฒนาโปรแกรมอย่างมีประสิทธิภาพ ดังนี้

1. การเข้าใจ ASP.NET Core Architecture

โครงสร้างพื้นฐานของ ASP.NET Core มีลักษณะแบ่งแยกและมีความยืดหยุ่น เพื่อให้สามารถพัฒนาแอปพลิเคชันได้ด้วยการใช้งานที่สะดวกและมีประสิทธิภาพ โครงสร้างนี้ประกอบไปด้วยส่วนสำคัญต่อไปนี้

1.1 Middleware: คลาส Startup เป็นจุดเริ่มต้นของแอปพลิเคชัน มีเมทอด ConfigureServices ที่ใช้สำหรับการกำหนดการตั้งค่าของ Dependency Injection Container และเมทอด Configure ที่ใช้สำหรับกำหนดการตั้งค่าของ Middleware และ Request Pipeline

1.2 Startup Class: Middleware เป็น components ที่มีหน้าที่ประมวลผล Request และ Response ในทุกระยะทางของแอปพลิเคชัน Middleware จะถูกเรียกตามลำดับที่กำหนดในเมทอด Configure ของคลาส Startup

1.3 Dependency Injection (DI): ASP.NET Core ใช้ระบบ Dependency Injection เพื่อให้แน่ใจว่า components ที่ต้องการในแอปพลิเคชันสามารถถูกสร้างและใช้งานได้อย่างถูกต้อง

1.4 Routing: การกำหนดเส้นทาง (Routing) ช่วยให้ระบบทราบว่าต้องเรียกใช้ Controller และ Action ใดเมื่อมีการเรียก Request มายังแอปพลิเคชัน

1.5 Model-View-Controller (MVC): MVC เป็นแนวคิดสำหรับการออกแบบและสร้างแอปพลิเคชัน ซึ่งแบ่งแยกหน้าที่ของการจัดการข้อมูล (Model), การแสดงผล (View), และการควบคุมการทำงาน (Controller)

1.6 Model Binding: ASP.NET Core มีระบบ Model Binding ที่ช่วยในการแปลงข้อมูลที่ส่งมากับ Request ให้อยู่ในรูปแบบของ Model ที่รับมือได้

1.7 Entity Framework Core: สำหรับการจัดการฐานข้อมูล, ASP.NET Core มักจะใช้ Entity Framework Core ซึ่งเป็น ORM (Object-Relational Mapping) ที่ช่วยในการทำงานกับข้อมูลฐานข้อมูล

1.8 Middleware สำหรับ Authentication และ Authorization: ASP.NET Core มี Middleware ที่มีชื่อว่า `Authentication` และ `Authorization` ที่ช่วยในการจัดการกระบวนการตรวจสอบตัวตนและการกำหนดสิทธิ์

1.9 JSON Configuration: การใช้ JSON configuration file เป็นที่นิยมในการกำหนดค่าและการตั้งค่าของแอปพลิเคชัน

1.10 Environment-specific Configuration: ASP.NET Core รองรับการกำหนดค่าและการตั้งค่าที่แตกต่างกันตาม Environment (Development, Staging, Production) ที่ทำงาน

1.11 Razor View Engine: ในกรณีที่ใช้ MVC, Razor View Engine ช่วยในการสร้าง HTML และ dynamic content

1.12 Static Files: Middleware สำหรับการจัดการ static files เช่น CSS, JavaScript Image ซึ่งสามารถให้บริการได้โดยตรงจากโปรเจค

1.13 Testing: การทำ Unit Testing ใน ASP.NET Core เป็นส่วนสำคัญเพื่อตรวจสอบความถูกต้องและประสิทธิภาพของโค้ด

1.14 Logging: ASP.NET Core มีระบบ Logging ที่สามารถกำหนดระดับและจัดการ Log ได้

การเรียนรู้เกี่ยวกับโครงสร้างพื้นฐานของ ASP.NET Core จะช่วยให้เราสามารถพัฒนาแอปพลิเคชันได้อย่างมีประสิทธิภาพ และปรับปรุงประสิทธิภาพของการทำงานของแอปพลิเคชันของเราได้

2. Routing และ MVC

การกำหนดเส้นทาง (Routing) และการใช้ MVC (Model-View-Controller) เป็นแนวคิดสำคัญในการพัฒนาแอปพลิเคชัน ASP.NET Core ที่สามารถจัดการข้อมูลและแสดงผลได้อย่างมีประสิทธิภาพ ต่อไปนี้คือการอธิบายเกี่ยวกับการกำหนดเส้นทาง (Routing) และการใช้ MVC (Model-View-Controller)

2.1 การกำหนดเส้นทาง (Routing)

Routing ใน ASP.NET Core มีหน้าที่แปลง HTTP Request มาเป็น Controller และ Action ที่เกี่ยวข้อง. มีหลายวิธีในการกำหนดเส้นทาง, แต่วิธีที่พบบ่อยคือการใช้ Attribute Routing และ Convention-Based Routing

2.1.1 Attribute Routing: Attribute Routing ให้คุณกำหนดเส้นทางโดยตรงที่ Controller หรือ Action โดยใช้ Attribute เช่น [Route]


[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    [HttpGet("{id}")]
    public ActionResult<User> GetUserById(int id)
    {
        //โค้ดการดึงข้อมูลผู้ใช้งานจากฐานข้อมูล
        return Ok(user);
    }
}

2.2.2 Convention-Based Routing: Convention-Based Routing ใช้ความตั้งใจที่กำหนดไว้ล่วงหน้าว่า URL จะแปลงเป็น Controller และ Action ไหน


app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

2.2 การใช้ MVC (Model-View-Controller)

MVC ใน ASP.NET Core ถูกออกแบบให้แบ่งแยกการทำงานของแอปพลิเคชันออกเป็น 3 ส่วนหลัก

2.2.1 Model: Model เป็นส่วนที่ใช้เก็บและจัดการข้อมูลของแอปพลิเคชัน ซึ่งสามารถเป็น class ที่รับข้อมูลจากฐานข้อมูลหรือจากแหล่งอื่น ๆ


public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

2.2.2 View: View เป็นส่วนที่แสดงผลข้อมูลและประสบการณ์ผู้ใช้ ใน ASP.NET Core, Razor View Engine ใช้ในการสร้าง HTML และส่วนต่าง ๆ ของหน้าเว็บ


@model User

<div>
    <p>@Model.FirstName @Model.LastName</p>
</div>

2.2.3 Controller: Controller เป็นส่วนที่ควบคุมการทำงานของแอปพลิเคชัน โดยรับ Request จาก Client, ดำเนินการประมวลผลผู้ส่ง Request และส่ง Response กลับ


public class UsersController : ControllerBase
{
    private readonly IUserRepository _userRepository;

    public UsersController(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public IActionResult GetUserById(int id)
    {
        var user = _userRepository.GetUserById(id);

        if (user == null)
        {
            return NotFound();
        }

        return View(user);
    }
}

MVC ช่วยให้แอปพลิเคชันสามารถแยกงานออกเป็นส่วนๆ ทำให้การบำรุงรักษาและการพัฒนาเป็นไปได้ง่ายขึ้น Model ใช้สำหรับจัดการข้อมูล, View ใช้สำหรับแสดงผล, และ Controller ใช้สำหรับควบคุมการทำงาน การกำหนดเส้นทาง (Routing) จะช่วยให้ Request ถูกส่งไปยัง Controller และ Action ที่ถูกเรียก

3. Middleware และ Pipeline

Middleware ใน ASP.NET Core เป็นส่วนสำคัญที่ใช้สำหรับประมวลผล Request และ Response ขณะที่ผ่านไปในทุกระยะทางของแอปพลิเคชัน Middleware จะถูกเรียกตามลำดับที่กำหนดในเมทอด Configure ของคลาส Startup และทำหน้าที่ตรวจสอบและแก้ไข Request หรือ Response ตามที่กำหนด นี่คือการอธิบายเพิ่มเติมเกี่ยวกับ Middleware และวิธีการใช้งาน

3.1 คำพิเศษ: ใน ASP.NET Core, Middleware ที่กำหนดให้เป็นเมทอดใน Configure จะเรียกว่า "Use" และมักจะมีลำดับการใช้งานตามที่กำหนด เช่น app.UseMiddlewareName()

3.2 ตำแหน่งของ Middleware: Middleware สามารถเรียกใช้ก่อนหรือหลัง Middleware อื่น ๆ ได้ ซึ่งทำให้เราสามารถกำหนดลำดับการประมวลผลได้อย่างแม่นยำ

3.3 Built-in Middleware: ASP.NET Core มี Middleware ที่ติดตั้งมาให้ทำหน้าที่ต่าง ๆ เช่น Authentication, Authorization, Static Files และเพื่อตรวจสอบความปลอดภัย

3.4 การสร้าง Custom Middleware: เราสามารถสร้าง Middleware ที่กำหนดเองได้ โดยการสร้างคลาสที่มีเมทอด InvokeAsync หรือ Invoke แล้วใช้เมทอดนี้ในการประมวลผล Request และ Response

ตัวอย่าง Middleware ที่ใช้กับ ASP.NET Core


//Middleware เช่น Logging Middleware
public class LoggingMiddleware
{
    private readonly RequestDelegate _next;

    public LoggingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        //ก่อนประมวลผล Request

        //เรียก Middleware ถัดไปในลำดับ
        await _next(context);

        //หลังประมวลผล Response
    }
}

//ใน Configure ใน Startup.cs
public void Configure(IApplicationBuilder app)
{
    app.UseMiddleware<LoggingMiddleware>();

    //Middleware อื่น ๆ ที่ต้องการให้กำหนดต่อไป
}

ในตัวอย่างนี้ LoggingMiddleware คือ Middleware ทำหน้าที่ป็นตัวกลางในการบันทึกข้อมูลก่อนและหลังการประมวลผล Request ด้วย _next(context) เพื่อเรียก Middleware ถัดไปในลำดับ

Middleware เป็นเครื่องมือที่สำคัญในการปรับแต่งและประมวลผล Request และ Response ใน ASP.NET Core ซึ่งช่วยให้สามารถสร้างและปรับแต่งการทำงานของแอปพลิเคชันได้อย่างยืดหยุ่น

4. Dependency Injection (DI)

Dependency Injection (DI) ใน ASP.NET Core เป็นเทคนิคที่ใช้ในการจัดการและแบ่งแยกความขึ้นต่อกันของ components หรือบริการที่ใช้ในแอปพลิเคชัน DI ช่วยให้เราสามารถเชื่อมต่อกับ dependencies ได้อย่างยืดหยุ่น เพื่อทำให้เกิดความยืดหยุ่นและทดสอบได้ง่ายขึ้น นี่คือขั้นตอนที่สำคัญในการใช้งาน DI ใน ASP.NET Core

4.1 การลงทะเบียน Dependencies: ในคลาส Startup ใน ASP.NET Core มีเมทอด ConfigureServices ที่ใช้ในการลงทะเบียน dependencies ที่แอปพลิเคชันต้องการ ตัวบริการ (Service) ที่ลงทะเบียนจะถูกเก็บไว้ใน Dependency Injection Container


public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>();
    //ลงทะเบียน dependencies อื่น ๆ ตามความต้องการ
}

4.2 Injection ใน Constructor: ในคลาสที่ต้องการใช้ dependency เราสามารถระบุมันใน constructor ของคลาส ASP.NET Core จะทำการ Inject มันให้เราโดยอัตโนมัติ


public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }
    //...
}

4.3 Lifetime Management: เราสามารถกำหนดระยะเวลาของ dependency ว่าจะให้มีอยู่เป็น Singleton, Scoped หรือ Transient ได้ ส่วนใหญ่แล้ว Singleton จะให้การประหยัดทรัพยากรสูงสุด แต่ต้องระวังเรื่องการใช้งาน concurrency


services.AddSingleton<IMyService, MyService>(); //Singleton
services.AddScoped<IMyService, MyService>();    //Scoped
services.AddTransient<IMyService, MyService>(); //Transient

4.4 Constructor Injection และ Method Injection: DI สนับสนุนการ Inject dependencies ใน constructor ของ class และ method ต่าง ๆ ด้วย parameter


public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    //Method Injection
    public IActionResult MyAction([FromServices] IMyService myService)
    {
        //...
    }

    //...
}

4.5 การทดสอบ (Unit Testing): DI ช่วยในการทำ Unit Testing ได้ง่ายขึ้น เนื่องจากเราสามารถใช้ Mock Object เพื่อทดสอบ class ที่มี dependencies ได้โดยง่าย

DI ใน ASP.NET Core ช่วยลดความผูกพันของ components และทำให้โค้ดมีความยืดหยุ่น ทดสอบได้ดี และการบำรุงรักษาง่ายขึ้น นอกจากนี้ DI เป็นหนึ่งในหลักการพื้นฐานของการพัฒนาแอปพลิเคชัน ASP.NET Core ที่น่าสนใจ

5. Entity Framework Core

Entity Framework Core (EF Core) เป็น ORM (Object-Relational Mapping) framework ที่ใช้สำหรับการจัดการฐานข้อมูลในแอปพลิเคชัน ASP.NET Core EF Core ช่วยให้การจัดการข้อมูลที่เก็บในฐานข้อมูลเป็นเรื่องสะดวกและยืดหยุ่นมากขึ้น นี่คือขั้นตอนหลักในการใช้ Entity Framework Core

5.1 การติดตั้ง Entity Framework Core: เริ่มต้นด้วยการติดตั้ง Entity Framework Core ผ่าน NuGet Package Manager หรือ CLI ด้วยคำสั่ง


dotnet add package Microsoft.EntityFrameworkCore

และในกรณีที่ต้องการใช้ Database Provider (SQL Server, MySQL, SQLite, etc.) ก็ต้องติดตั้ง NuGet Package ของ Provider นั้น ๆ ด้วย

5.2 สร้าง Model: สร้าง class ที่เป็น representation ของ entities ในฐานข้อมูล. EF Core จะทำการ map ระหว่าง class และ table ในฐานข้อมูล


public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

5.3 สร้าง DbContext: DbContext เป็นคลาสที่ใช้ในการเชื่อมต่อกับฐานข้อมูล, และรวบรวม entities ที่จะถูก map ในฐานข้อมูล


public class ApplicationDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    //เพิ่มคุณสมบัติ DbSet อื่นๆ สำหรับเอนทิตีอื่น
}

5.4 การกำหนด Connection String: ในคลาส Startup ใน ASP.NET Core, ให้กำหนด connection string ในเมทอด ConfigureServices


public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    //...
}

5.5 การสร้างและปรับแต่งฐานข้อมูล: สร้าง migration และปรับแต่งฐานข้อมูลในคำสั่ง CLI ด้วยคำสั่ง


dotnet ef migrations add InitialCreate
dotnet ef database update

หรือสร้าง migrations และ update จาก Visual Studio

5.6 การใช้ Entity Framework Core: เพื่อให้สามารถใช้งาน Entity Framework Core สามารถ Inject DbContext ใน constructor ของ service หรือ controller ได้


public class ProductService
{
    private readonly ApplicationDbContext _context;

    public ProductService(ApplicationDbContext context)
    {
        _context = context;
    }

    public List GetAllProducts()
    {
        return _context.Products.ToList();
    }

    //สร้าง CRUD อื่นๆ...
}

5.7 Querying ข้อมูล: Entity Framework Core มี LINQ (Language Integrated Query) ที่สามารถใช้ในการ query ข้อมูลจากฐานข้อมูลได้


var expensiveProducts = _context.Products
                                 .Where(p => p.Price > 100)
                                 .ToList();

หรือสร้าง migrations และ update จาก Visual Studio

5.8 การทำ CRUD (Create, Read, Update, Delete): สามารถใช้ EF Core ในการทำ CRUD ได้ง่าย ๆ


//Create
var newProduct = new Product { Name = "New Product", Price = 150 };
_context.Products.Add(newProduct);
_context.SaveChanges();

//Read
var product = _context.Products.Find(1);

//Update
product.Price = 200;
_context.SaveChanges();

//Delete
_context.Products.Remove(product);
_context.SaveChanges();

หรือสร้าง migrations และ update จาก Visual Studio

Entity Framework Core มีความสามารถที่มีประสิทธิภาพสูงในการจัดการฐานข้อมูลในแอปพลิเคชัน ASP.NET Core และช่วยให้การทำงานกับข้อมูลเป็นไปอย่างรวดเร็วและมีประสิทธิภาพ

ไปอ่าน EP2 ต่อกดตรงนี้ The basics of ASP.NET Core [EP1/2]