Dependency Injection là kỹ thuật giúp một class “nhận” các phụ thuộc (dependencies) từ bên ngoài thay vì tự tạo ra chúng.
Không dùng DI:
Dùng DI:
➡️ DI giúp code dễ test hơn, dễ mở rộng hơn, và tuân theo nguyên tắc SOLID, đặc biệt là Dependency Inversion Principle.
Từ Sitecore 9+, DI dựa trên ASP.NET Core Dependency Injection Container, cho phép đăng ký service bằng:
Config patch (Sitecore cách truyền thống)
IServiceCollection (chuẩn .NET Core)
Sitecore sẽ load tất cả service khi khởi động pipeline.
| Layer | Vai trò DI |
|---|---|
| Foundation | Đăng ký các service dùng chung cho toàn hệ thống |
| Feature | Đăng ký service riêng của từng module |
| Project | Hầu như không đăng ký service (chỉ dùng) |
📌 Mỗi module thường có file config riêng:
Ví dụ trong Foundation:
Foundation.DependencyInjection.config| Lifetime | Ý nghĩa |
|---|---|
| Transient | Tạo mới mỗi lần được gọi |
| Scoped | Trong Sitecore tương đương Transient (không có HttpContext thực sự) |
| Singleton | Tồn tại suốt vòng đời ứng dụng |
📌 Thực tế: Sitecore dùng Transient và Singleton là chủ yếu.
IServiceCollection (chuẩn .NET Core)Nếu bạn dùng Sitecore 10+ với Headless hoặc ASP.NET Core rendering host, bạn có thể thêm DI như sau:
Startup.cs➕ Ưu điểm: quen thuộc với .NET Core
➖ Không dùng được trong MVC truyền thống (chỉ dành cho ASP.NET Core Rendering Host)
Không cần tạo đối tượng bằng new nữa.
DI trong Sitecore cho phép tiêm service vào:
Ví dụ trong Repository:
Trước Sitecore 9, người ta dùng Sitecore Factory:
📌 DI là cách hiện đại hơn, đơn giản hơn, testable hơn.
Feature.Search.configTất cả module được đăng ký tự động khi Sitecore khởi động.
Feature A → Feature B → Foundation C → Feature A
→ Không bao giờ được phép.
Khi service không được load.
VD class static → không inject được.
Singleton nhưng chứa dữ liệu request → sai.
| Mục | Nội dung |
|---|---|
| DI trong Sitecore | Tích hợp .NET DI container |
| Nơi đăng ký | Foundation & Feature |
| Cách đăng ký | Config patch (phổ biến) hoặc IServiceCollection |
| Nơi sử dụng | Controller, Repository, Service, Pipelines |
| Lợi ích | Tái sử dụng, dễ test, tách module, chuẩn Helix |
👉 Gợi ý bài viết tiếp theo:
🔸 “Config patch file trong App_Config/Include”