.NET

Dependency Injection

Service lifetime (singleton, scoped, transient), đăng ký service, IServiceProvider, best practices

24 câu hỏi phỏng vấn·
Mid-Level
1

Sự khác biệt chính giữa các lifetime Singleton, Scoped và Transient là gì?

Câu trả lời

Singleton tạo một instance duy nhất cho toàn bộ lifetime của ứng dụng, Scoped tạo một instance cho mỗi request HTTP (hoặc scope), và Transient tạo một instance mới mỗi khi được inject. Các lifetime này xác định khi nào và bao nhiêu lần container DI khởi tạo một service. Dùng Singleton cho các service stateless được chia sẻ, Scoped cho các service gắn với request (như DbContext), và Transient cho các service nhẹ không có state.

2

Nên dùng lifetime nào để đăng ký DbContext của Entity Framework Core?

Câu trả lời

DbContext nên được đăng ký với lifetime Scoped vì nó không thread-safe và duy trì trạng thái tracking của các entity. Mỗi yêu cầu HTTP cần có instance DbContext riêng để tránh các vấn đề về đồng thời. Việc đăng ký được thực hiện bằng AddDbContext, vốn tự động cấu hình lifetime Scoped. Dùng Singleton sẽ gây lỗi đồng thời, còn Transient sẽ lãng phí tài nguyên do tạo ra quá nhiều instance.

3

Làm thế nào để đăng ký một service với một interface và phần triển khai của nó?

Câu trả lời

Việc đăng ký service được thực hiện bằng các phương thức AddSingleton, AddScoped hoặc AddTransient, chỉ định interface làm kiểu service và lớp cụ thể làm phần triển khai. Cú pháp là services.Add{Lifetime}<IInterface, Implementation>(). Cách tiếp cận này tuân theo nguyên tắc đảo ngược phụ thuộc và giúp việc kiểm thử dễ dàng hơn bằng cách cho phép thay thế phần triển khai. Container DI sẽ tự động phân giải phần triển khai cụ thể khi inject interface.

4

Trong trường hợp nào nên ưu tiên AddSingleton hơn AddScoped?

5

Vai trò của IServiceProvider trong hệ thống DI là gì?

+21 câu hỏi phỏng vấn

Nắm vững .NET cho lần phỏng vấn tiếp theo

Truy cập tất cả câu hỏi, flashcards, bài kiểm tra kỹ thuật, bài tập code review và mô phỏng phỏng vấn.

Bắt đầu miễn phí