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.

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.
CÔNG TY TNHH GIẢI PHÁP CÔNG NGHỆ TRANG DESIGNER
Trang Designer chuyên thiết kế website chuẩn SEO, thiết kế logo toàn diện giúp doanh nghiệp xây dựng một thương hiệu mạnh và bán hàng hiệu quả trên các nền tảng số cho nhiều lĩnh vực kinh doanh.
Vui lòng liên hệ: 138 Hiền Vương, Phường Phú Thạnh, Quận Tân Phú, TP. Hồ Chí Minh
Điện thoại: 0903.728.335
Website: www.trangdesigner.id.vn