Trang Designer – Thiết kế website – Mua bán theme giá rẻ, plugin giá rẻ – Dịch vụ thiết kế website giá rẻ chuyên nghiệp chuẩn SEO – Mua bán theme giá rẻ, plugin giá rẻ chính hãng 100% từ nhà cung cấp, hỗ trợ update trọn đời

Tìm hiểu về Dependency Injection trong ASP.NET Core, cách sử dụng AddTransient, AddScoped, AddSingleton, và cách ứng dụng DI vào Controller, Middleware để tối ưu 
hóa dự án của bạn.
Tìm hiểu về Dependency Injection ASP.NET Core
Tìm hiểu về Dependency Injection ASP.NET Core

Giới thiệu về Dependency Injection trong ASP.NET Core

Dependency Injection (DI) là một kỹ thuật lập trình được sử dụng rộng rãi trong ASP.NET Core để quản lý sự phụ thuộc giữa các đối tượng. DI giúp cải thiện tính linh hoạt, khả năng mở rộng và dễ bảo trì của ứng dụng bằng cách giảm sự phụ thuộc cứng nhắc giữa các thành phần.

ASP.NET Core có một hệ thống Dependency Injection tích hợp sẵn, giúp đơn giản hóa việc quản lý các dịch vụ và tăng tính tái sử dụng của mã nguồn.

Tại sao cần sử dụng Dependency Injection?

Giảm sự phụ thuộc chặt chẽ (Loose Coupling)

DI giúp giảm bớt việc khởi tạo trực tiếp các đối tượng bên trong class, từ đó làm cho code dễ bảo trì và mở rộng hơn.

Dễ dàng thay thế và mở rộng

Với DI, bạn có thể dễ dàng thay đổi hoặc thay thế các dependency mà không cần chỉnh sửa code gốc.

Hỗ trợ kiểm thử dễ dàng hơn

Việc sử dụng DI giúp dễ dàng thay thế các dependency bằng mock object trong Unit Test.

Quản lý vòng đời đối tượng tốt hơn

ASP.NET Core DI cho phép quản lý vòng đời của các dependency theo nhiều cách khác nhau, giúp tối ưu tài nguyên.

Các loại dịch vụ trong Dependency Injection ASP.NET Core

Trong ASP.NET Core, có ba kiểu đăng ký dịch vụ chính:

Transient (AddTransient)

  • Đối tượng mới được tạo mỗi khi có một request đến.
  • Thích hợp với các dịch vụ không có trạng thái (stateless).
services.AddTransient<IMyService, MyService>();

Khi nào dùng? Khi bạn cần một đối tượng mới mỗi lần nó được gọi.

Scoped (AddScoped)

  • Đối tượng được tạo một lần trong một request và được sử dụng lại trong suốt vòng đời của request đó.
services.AddScoped<IMyService, MyService>();

Khi nào dùng? Khi cần một phiên bản duy nhất trong phạm vi một request (ví dụ: context của database).

Singleton (AddSingleton)

  • Đối tượng chỉ được khởi tạo một lần duy nhất và được sử dụng trong suốt vòng đời ứng dụng.
services.AddSingleton<IMyService, MyService>();

Khi nào dùng? Khi bạn có dữ liệu dùng chung, ví dụ như caching service, configuration service.

Cách sử dụng Dependency Injection trong ASP.NET Core

Cấu hình DI trong Program.cs

Để sử dụng DI, bạn cần đăng ký các dịch vụ trong phương thức ConfigureServices của Program.cs:

var builder = WebApplication.CreateBuilder(args);

// Đăng ký dịch vụ
builder.Services.AddTransient<IMyService, MyService>();
builder.Services.AddScoped<IMyRepository, MyRepository>();
builder.Services.AddSingleton<ICacheService, CacheService>();

var app = builder.Build();

Inject Service vào Controller

Sau khi đăng ký dịch vụ, bạn có thể sử dụng constructor injection để inject nó vào controller hoặc các class khác.

public class MyController : ControllerBase
{
    private readonly IMyService _myService;

    // Inject IMyService vào controller thông qua constructor
    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    [HttpGet]
    public IActionResult GetData()
    {
        var data = _myService.GetData();
        return Ok(data);
    }
}

Inject Service vào Middleware

Bạn có thể sử dụng DI trong middleware như sau:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IMyService _myService;

    public CustomMiddleware(RequestDelegate next, IMyService myService)
    {
        _next = next;
        _myService = myService;
    }

    public async Task Invoke(HttpContext context)
    {
        _myService.DoSomething();
        await _next(context);
    }
}

Ví dụ thực tế

Tạo interface IMyService

public interface IMyService
{
    string GetMessage();
}

Tạo class MyService

public interface IMyService
{
    string GetMessage();
}

Đăng ký service trong Program.cs

builder.Services.AddTransient<IMyService, MyService>();

Sử dụng DI trong Controller

[ApiController]
[Route("api/[controller]")]
public class DemoController : ControllerBase
{
    private readonly IMyService _myService;

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

    [HttpGet("message")]
    public IActionResult GetMessage()
    {
        return Ok(_myService.GetMessage());
    }
}

Một số lưu ý khi sử dụng Dependency Injection

Không lạm dụng Singleton

  • Singleton có thể gây ra vấn đề về trạng thái (state) nếu không được thiết kế đúng cách.

Sử dụng đúng loại đăng ký dịch vụ

  • Transient: Dùng cho dịch vụ không có trạng thái.
  • Scoped: Dùng khi cần chia sẻ dữ liệu trong request.
  • Singleton: Dùng cho dịch vụ có trạng thái chung toàn ứng dụng.

Không inject quá nhiều dependency vào một class

  • Nếu một class có quá nhiều dependency, đó có thể là dấu hiệu của việc vi phạm nguyên tắc SOLID, hãy cân nhắc sử dụng Factory Pattern hoặc Mediator Pattern.

Kết luận

Dependency Injection trong ASP.NET Core là một công cụ mạnh mẽ giúp quản lý sự phụ thuộc giữa các thành phần trong ứng dụng. Việc sử dụng DI giúp tăng tính linh hoạt, dễ mở rộng, dễ kiểm thử và tối ưu hóa hiệu suất.

  • Transient: Tạo đối tượng mới mỗi lần gọi.
  • Scoped: Giữ nguyên đối tượng trong một request.
  • Singleton: Tạo duy nhất một đối tượng dùng cho toàn ứng dụng.

Bằng cách sử dụng đúng kỹ thuật Dependency Injection, bạn có thể viết code sạch hơn, dễ bảo trì hơn và tối ưu hơn trong ứng dụng ASP.NET Core của mình.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

pzf-icon