Dependency Injection (DI) trong Unity
C# Code
// --- CÁCH LÀM THÔNG THƯỜNG (phụ thuộc cứng) ---
public class Player : MonoBehaviour
{
private HealthSystem healthSystem;
void Awake()
{
// Player tự tạo ra hoặc tìm kiếm HealthSystem.
// Điều này tạo ra một sự phụ thuộc cứng vào HealthSystem.
healthSystem = GetComponent<HealthSystem>();
}
}
// --- SỬ DỤNG DEPENDENCY INJECTION ---
// 1. Dùng Constructor Injection (phổ biến nhất trong DI)
public class PlayerWithDI
{
private IHealthSystem _healthSystem;
// Phụ thuộc được 'tiêm' vào qua constructor.
// Player không cần biết HealthSystem được tạo ra như thế nào.
public PlayerWithDI(IHealthSystem healthSystem)
{
_healthSystem = healthSystem;
}
}
// 2. Dùng Method/Property Injection (thường thấy trong Unity với [Inject])
public class PlayerWithZenject : MonoBehaviour
{
[Inject]
private IHealthSystem _healthSystem;
[Inject]
private IInputManager _inputManager;
void Update()
{
// Sử dụng các dependency đã được tiêm vào.
}
}
/*
* Lợi ích của DI:
* - Decoupling: Player không còn phụ thuộc trực tiếp vào class HealthSystem, mà phụ thuộc vào một interface IHealthSystem.
* - Testability: Dễ dàng thay thế HealthSystem bằng một 'mock' HealthSystem giả để unit test.
* - Reusability: Các component trở nên độc lập và dễ tái sử dụng hơn.
* - Dễ dàng quản lý các dependency phức tạp trong các dự án lớn.
*
* Các framework DI phổ biến cho Unity: Zenject, VContainer.
*/Giới thiệu về mẫu thiết kế Dependency Injection (DI) và tại sao nó giúp code của bạn dễ bảo trì, dễ test và giảm sự phụ thuộc cứng (hard dependencies).