1. Dependency Injection là gì?

Dependency Injection (DI), hay tiêm phụ thuộc, là kỹ thuật cung cấp những đối tượng hoặc thành phần mà một đối tượng cần sử dụng từ bên ngoài, thay vì để đối tượng đó tự tạo ra tất cả những thành phần cần thiết.

Để hiểu đơn giản, hãy tưởng tượng một nhân viên cần máy tính để làm việc. Thay vì tự sản xuất máy tính, nhân viên được công ty cung cấp máy tính để sử dụng. Trong lập trình, một lớp cũng có thể được cung cấp những đối tượng cần thiết theo cách tương tự.

Ví dụ, một ứng dụng Flutter có chức năng lấy danh sách sản phẩm từ máy chủ. Lớp xử lý sản phẩm cần sử dụng một đối tượng API Client để gửi yêu cầu HTTP. Thay vì tự tạo API Client bên trong lớp đó, chúng ta có thể truyền API Client vào từ bên ngoài. Đây là cách áp dụng Dependency Injection.

  1. Dependency Injection hoạt động như thế nào?

Thông thường, một lớp có thể tự tạo đối tượng mà nó cần sử dụng. Cách làm này có thể khiến các lớp phụ thuộc chặt chẽ vào nhau, gây khó khăn khi thay đổi hoặc kiểm thử.

Với Dependency Injection, các thành phần cần thiết được tạo ở một nơi phù hợp rồi truyền vào đối tượng sử dụng chúng. Nhờ đó, việc khởi tạo đối tượng và việc xử lý nghiệp vụ được tách biệt rõ ràng hơn.

Ví dụ, quy trình có thể là:

Khởi tạo API Client → Truyền API Client vào lớp quản lý sản phẩm → Lớp quản lý sản phẩm sử dụng API Client để lấy dữ liệu → Giao diện nhận kết quả và hiển thị

Trong Flutter, Dependency Injection có thể được thực hiện thông qua constructor, Provider, Riverpod hoặc những công cụ chuyên dụng khác (như get_it, injectable).

  1. Ví dụ minh họa

Định nghĩa các lớp dịch vụ và lưu trữ:

class ProductService {
  void getProducts() {
    print('Đang lấy danh sách sản phẩm');
  }
}

class ProductRepository {
  final ProductService service;

  ProductRepository(this.service);

  void loadProducts() {
    service.getProducts();
  }
}

Trong ví dụ này, ProductRepository cần ProductService để thực hiện công việc. Thay vì tự tạo ProductService bên trong lớp, đối tượng này được truyền vào thông qua constructor ProductRepository(this.service).

Khi khởi tạo và sử dụng:

final service = ProductService();
final repository = ProductRepository(service);

repository.loadProducts();

Như vậy, ProductRepository không cần tự chịu trách nhiệm tạo ProductService. Khi cần thay đổi cách lấy dữ liệu hoặc kiểm thử, chúng ta có thể cung cấp một đối tượng khác có cùng giao diện phù hợp.

  1. Lợi ích của Dependency Injection

Dependency Injection giúp giảm sự phụ thuộc chặt chẽ giữa các thành phần (low coupling), hỗ trợ tái sử dụng mã nguồn và giúp kiểm thử (unit test) dễ dàng hơn. Ví dụ, khi kiểm thử chức năng lấy sản phẩm, chúng ta có thể truyền vào một đối tượng giả lập (mock object) thay vì phải gọi máy chủ thật.

  1. Kết luận

Dependency Injection là kỹ thuật cung cấp các thành phần cần thiết từ bên ngoài cho đối tượng sử dụng chúng. Trong Flutter, kỹ thuật này giúp tổ chức mã nguồn rõ ràng, giảm sự phụ thuộc giữa các lớp và thuận tiện hơn khi bảo trì, mở rộng hoặc kiểm thử ứng dụng.

 

Bài viết khác

Tìm hiểu về Provider & Notifier là gì?

  Provider & Notifier là gì? Trong quá trình phát triển ứng dụng Flutter, State Management (quản lý trạng thái) là một phần quan trọng giúp quản lý dữ liệu và cập nhật giao diện khi dữ liệu thay đổi. Đối với những ứng dụng đơn giản, có thể sử dụng setState() để cập nhật […]

Tìm hiểu về Riverpod / BLoC / Provider

  Tổng quan Trong Flutter, State Management (quản lý trạng thái) là quá trình quản lý dữ liệu và trạng thái của ứng dụng, giúp giao diện được cập nhật khi dữ liệu thay đổi. Đối với ứng dụng đơn giản, có thể sử dụng setState() để cập nhật giao diện. Tuy nhiên, khi ứng […]

tìm hiểu về State Management

  State Management là gì? State Management (quản lý trạng thái) là quá trình quản lý dữ liệu và trạng thái của các thành phần trong ứng dụng. Trong quá trình sử dụng, dữ liệu của ứng dụng có thể thay đổi và giao diện cần được cập nhật tương ứng để hiển thị thông […]

Go Fundamentals

Go là gì? Go, còn được biết đến với tên gọi Golang, là một ngôn ngữ lập trình mã nguồn mở, được thiết kế tại Google bởi Robert Griesemer, Rob Pike và Ken Thompson. Go là ngôn ngữ biên dịch (compiled language) và có hệ thống kiểu dữ liệu tĩnh (statically typed). Khác với những […]

Tìm hiểu về Hive Local

  Hive Local Storage là gì? Hive là một thư viện cơ sở dữ liệu cục bộ (Local Database) được sử dụng trong Flutter và Dart để lưu trữ dữ liệu trực tiếp trên thiết bị của người dùng. Hive hoạt động theo mô hình NoSQL, tổ chức dữ liệu theo dạng Key – Value […]

Tìm hiểu về Forms & Input Validation trong Flutter

1. Forms & Input Validation là gì? Trong Flutter, Forms & Input Validation là kiến thức về cách xây dựng biểu mẫu để người dùng nhập thông tin và kiểm tra tính hợp lệ của dữ liệu trước khi ứng dụng xử lý hoặc gửi dữ liệu lên máy chủ. Form là biểu mẫu chứa […]

Leave a Reply

Your email address will not be published. Required fields are marked *