Dependency Injection (DI) Life Cycles in .NET
November 2, 2024Trong .NET, Dependency Injection (DI) cho phép chúng ta quản lý việc khởi tạo và vòng đời của đối tượng, điều này rất quan trọng cho hiệu suất và tối ưu hóa tài nguyên. Dưới đây là phân tích chi tiết về ba vòng đời của DI cùng với ví dụ về thời điểm và lý do sử dụng chúng:
1. Transient
Đặc điểm: Đối tượng Transient có vòng đời ngắn, một instance mới được tạo mỗi khi dịch vụ được yêu cầu.
Khi nào sử dụng: Sử dụng Transient khi đối tượng không cần lưu giữ dữ liệu giữa các lần yêu cầu khác nhau, lý tưởng cho các thao tác không có trạng thái.
Ví dụ: Giả sử bạn có một IEmailSenderService. Mỗi email được gửi là độc lập, vì vậy mỗi lần inject dịch vụ này, một instance mới là hợp lý. Không cần nhớ email đã gửi trước đó.
Hãy nghĩ về dịch vụ Transient như một máy pha cà phê trong quán – mỗi lần bạn gọi cà phê, máy sẽ pha một cốc mới cho bạn.
2. Scoped
Đặc điểm: Đối tượng Scoped có vòng đời tương ứng với một yêu cầu HTTP duy nhất, và được chia sẻ giữa tất cả các thành phần xử lý cùng một yêu cầu.
Khi nào sử dụng: Sử dụng Scoped khi bạn cần quản lý dữ liệu trên từng yêu cầu riêng lẻ, ví dụ như quản lý các giao dịch cơ sở dữ liệu sao cho các thao tác trong cùng một yêu cầu sử dụng cùng một kết nối và dữ liệu nhất quán.
Ví dụ: Trong ASP.NET Core, DbContext thường được sử dụng dưới dạng Scoped. Nó đảm bảo rằng trong suốt quá trình của một yêu cầu web duy nhất, tất cả các thao tác (như lưu và truy vấn dữ liệu) sẽ sử dụng cùng một instance của context, giữ cho các thao tác nhất quán và tránh việc mở nhiều kết nối đến cơ sở dữ liệu.
Hãy tưởng tượng dịch vụ Scoped như một chiếc xe thuê. Bạn sử dụng nó trong suốt chuyến đi của mình và sau đó trả lại khi không cần nữa.
3. Singleton
Đặc điểm: Đối tượng Singleton chỉ được tạo một lần và được tái sử dụng suốt vòng đời của ứng dụng.
Khi nào sử dụng: Sử dụng Singleton khi bạn cần giữ trạng thái toàn cục hoặc khi việc khởi tạo đối tượng tốn kém và cần tái sử dụng để tránh chi phí dư thừa.
Ví dụ: ICacheService thường được định nghĩa là Singleton. Caching có nhiệm vụ lưu trữ dữ liệu để truy cập nhanh chóng và không cần phải tạo lại mỗi lần.
Singleton giống như một chiếc chìa khóa nhà – tất cả mọi người trong nhà đều sử dụng cùng một chiếc chìa khóa để vào, không cần tạo chìa mới mỗi lần.
Việc chọn đúng vòng đời dịch vụ trong Dependency Injection giúp tối ưu hóa bộ nhớ và sử dụng tài nguyên, đảm bảo rằng ứng dụng của bạn hoạt động hiệu quả. Sử dụng Transient cho các serrvice nhỏ, không có trạng thái, Scoped cho các service có dữ liệu theo từng yêu cầu, và Singleton cho các tài nguyên chia sẻ toàn cầu trong ứng dụng.