Module 7 - Dependency Injection
Tóm tắt: Dependency injection trong .NET 10: vì sao lớp không nên tự
newphụ thuộc, container hoạt động thế nào, ba lifetime và lỗi captive dependency,Program.cs, options pattern, keyed services và các anti-pattern hay gặp. Module khép lại bằng một case study rò rỉ dữ liệu giữa tenant và bài ôn tập có lab chạy được.
Kiến thức tiên quyết
- Interface, class, constructor (Module 4); generic, lambda, extension method (Module 5);
async/await(Module 6). - Viết unit test với xUnit (bài 0.4) và chạy một Web API nhỏ (bài 0.5).
- Module này đứng trước phần ASP.NET Core (Module 8). Middleware, controller, JWT,
DbContextxuất hiện trong một số ví dụ đều được giải thích ngắn tại chỗ, kèm link tới bài dạy kỹ. Riêng Bài 2 của bài 7.4 cần EF Core, nên làm sau bài 8.10.
Chuẩn bị môi trường
Phần lớn ví dụ chạy bằng project console:
dotnet new console -n DiPlayground
cd DiPlayground
dotnet add package Microsoft.Extensions.DependencyInjectionDán code vào Program.cs, đặt mọi khai báo class, interface, record ở cuối file (sau code chạy), rồi dotnet run. Ví dụ cần cấu hình hoặc logging thì cài thêm Microsoft.Extensions.Hosting và dùng Host.CreateApplicationBuilder; ví dụ cần ASP.NET Core thì tạo project bằng dotnet new web. Test dùng xUnit và NSubstitute (dotnet add package NSubstitute). Mọi output trong module được chạy trên .NET 10.
Nội dung module
- 7.1 - Vấn đề DI giải quyết
- 7.2 - IoC Container và DI Container
- 7.3 - Ba cách tiêm dependency
- 7.4 - Service Lifetimes
- 7.5 - Registering Services
- 7.6 - Program.cs và WebApplicationBuilder
- 7.7 - Options Pattern
- 7.8 - Keyed Services (.NET 8)
- 7.9 - Anti-patterns
- 7.10 - Decorator, module đăng ký và Scrutor
- 7.11 - Captive dependency làm lộ dữ liệu giữa tenant
- 7.12 - Đổi cấu hình mà ứng dụng không nhận
- 7.13 - Ôn tập và đánh giá Module 7
Bài liên quan
- Singleton, Scoped hay Transient? Chọn sai là DbContext sống mãi — Ba lifetime trong DI container của ASP.NET Core khác nhau ở thời điểm tạo và thời điểm dispose instance.
- Forward header trong ASP.NET Core: vì sao 'forward hết' là một lỗi kiến trúc — Vòng lặp copy mọi header từ request đi vào sang lời gọi HttpClient đi ra là đoạn code trông vô hại nhất mà tôi từng thấy gây sự cố production.
- MailKit trong .NET: gửi email SMTP và dựng HTML email template chạy đúng trên Outlook — MailKit là thư viện mail mà chính tài liệu Microsoft khuyến nghị thay cho System.Net.Mail.SmtpClient.