Dependency Injection (DI) trong Unity

Tags:
Architecture
Design Pattern
Optimization

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).

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Hướng dẫn cài đặt và sử dụng Zenject, một framework Dependency Injection phổ biến cho Unity, để quản lý các phụ thuộc trong dự án một cách hiệu quả.

Architecture
Design Pattern
DI
Zenject
Optimization

Giới thiệu về Clean Architecture, một triết lý thiết kế phần mềm giúp tách biệt các mối quan tâm thành các lớp riêng biệt (Entities, Use Cases, Adapters, Frameworks), tạo ra một hệ thống độc lập, dễ kiểm thử và bảo trì.

Architecture
Design Pattern
DI
Optimization

Sử dụng mẫu Observer với C# events, Actions và UnityEvents để tạo ra các hệ thống giao tiếp với nhau mà không cần biết về sự tồn tại của nhau (decoupling), giúp code linh hoạt và dễ bảo trì.

Architecture
Design Pattern
Event
Optimization

So sánh các thuật toán sắp xếp như Bubble Sort, Insertion Sort và Quick Sort và khi nào nên sử dụng chúng trong game (ví dụ: sắp xếp bảng xếp hạng).

Algorithm
Architecture
Optimization

Một hệ thống Object Pool đơn giản để tái sử dụng các đối tượng thay vì tạo và hủy liên tục, giúp tối ưu hiệu năng đáng kể, đặc biệt khi cần tạo nhiều đối tượng như đạn, kẻ địch.

Design Pattern
Object Pool
Optimization
Performance

Một mẫu Singleton cơ bản trong Unity để đảm bảo chỉ có một thực thể của một lớp tồn tại trong game. Hữu ích cho các hệ thống toàn cục như GameManager, AudioManager.

Design Pattern
Singleton
Architecture

Expression Trees là một tính năng C# nâng cao cho phép bạn biểu diễn code dưới dạng cây dữ liệu. Trong Unity, nó mở ra khả năng xây dựng các hệ thống phức tạp như trình tạo truy vấn động, hệ thống AI có thể sửa đổi hành vi tại runtime, hoặc các công cụ editor tùy chỉnh mà không cần sinh mã code mới.

Architecture
Algorithm
Optimization
C#

Một cấu trúc Finite State Machine (FSM) đơn giản sử dụng enum và switch-case để quản lý các trạng thái khác nhau của AI, như đi tuần, truy đuổi và tấn công.

AI
Architecture
Design Pattern
Gameplay

Áp dụng mẫu MVP để tách biệt logic game (Model), UI (View), và phần điều khiển trung gian (Presenter). Giúp code dễ dàng unit test và quản lý các luồng dữ liệu phức tạp trong UI.

Architecture
Design Pattern
UI
MVP

Triển khai mẫu Service Locator, một cách đơn giản để các phần khác nhau của game có thể truy cập vào các hệ thống toàn cục (services) như AudioManager, GameManager mà không cần tham chiếu trực tiếp.

Architecture
Design Pattern
Singleton
DI