Trang chủ Development

Dependency injection là gì? 3 điều cần biết về DI

Dependency injection là gì? 3 điều cần biết về DI

Tìm hiểu về kỹ thuật Dependency injection trong công nghệ phần mềm

Dependency injection là một kỹ thuật lập trình giúp tách một class độc lập với các biến phụ thuộc. Giải nghĩa theo Wikipedia ta có: Trong công nghệ phần mềm, Dependency injection là một kỹ thuật nhờ đó một đối tượng (hoặc phương thức tĩnh) có thể cung cấp các phụ thuộc của một đối tượng khác. Một biến phụ thuộc là một đối tượng có thể sử dụng (như một dịch vụ).

Tuy nhiên, khái niệm này có thể không mấy dễ hiểu ngay lần đầu tiên bạn đọc nó. Do đó, để hiểu cụ thể về kỹ thuật này dưới góc độ kỹ thuật, trước tiên chúng ta cùng phân tích khái niệm theo cách tổng quan và thông thường nhất.

Phụ thuộc có nghĩa trông cậy vào một sự hỗ trợ, trợ giúp nào đó. Nếu nói chúng ta đang dựa dẫm quá nhiều vào điện thoại di động, điều đó có nghĩa là chúng ta đang phụ thuộc vào chúng.

Tiếp theo chúng ta sẽ cùng phân tích về phụ thuộc trong lập trình:

Khi lớp A sử dụng một số chức năng của lớp B, có nghĩa là lớp A có một phụ thuộc của lớp B.

Dependency injection là gì? 3 điều cần biết về DI - Ảnh 1.

Trong Java, trước khi bạn có thể sử dụng các method của lớp khác, bạn sẽ cần tạo đối tượng của lớp đó (tức là lớp A cần tạo một đối tượng của lớp B).

Và việc chuyển nhiệm vụ tạo đối tượng cho người khác và trực tiếp sử dụng biến phụ thuộc được gọi là dependency injection.

Có 3 loại dependency injection phổ biến

1. constructor injection: các biến phụ thuộc được cung cấp thông qua một hàm tạo lớp.

2. setter injection: client đưa ra một phương thức setter mà injector sử dụng để dependency injection

3. interface injection: biến phụ thuộc sẽ đưa ra một method mà để đưa biên này vào bất kỳ máy khách nào chạy qua. Máy khách sẽ phải triển khai một giao diện có chứa setter method chấp nhận biến phụ thuộc.

Nhiệm vụ của dependency injection

Dependency injection là gì? 3 điều cần biết về DI - Ảnh 2.

1. Tạo các đối tượng

2. Hiểu lớp nào sẽ cần những đối tượng nào

3. Cung cấp cho lớp đó toàn bộ những đối tượng đó

Nếu có bất kỳ thay đổi nào xảy ra với các đối tượng, DI sẽ xem xét các thay đổi đó mà không quan tầm đến lớp đang sử dụng các đối tượng đó. Như vậy, nếu các đối tượng thay đổi trong tương lai, trách nhiệm của DI là cung cấp các đối tượng thích hợp cho lớp sử dụng các đối tượng đó.

Đảo ngược kiểm soát — khái niệm đằng sau DI

Một lớp không nên được cấu hình với các biến phụ thuộc tĩnh mà nên được cấu hình bởi 1 số lớp khác từ bên ngoài. Đây là nguyên tắc thứ năm trong S.O.L.I.D - năm nguyên tắc cơ bản của lập trình hướng đối tượng – theo như nguyên tắc này, một lớp nên dựa vào abstraction chứ không phải concretions (theo thuật ngữ đơn giản, mã hóa cứng – hard-coded).

Theo đó, một lớp nên tập trung vào việc hoàn thành nhiệm vụ của mình chứ không phải tạo ra các đối tượng cần thiết cho việc thực hiện các nhiệm vụ đó.

Một số lợi ích và hạn chế từ việc sử dụng DI

1. Hỗ trợ kiểm tra Unit

2. Giảm boiler plate code do việc tạo các biến phụ thuộc đã được injector thực hiện.

3. Dễ dàng hơn trong việc mở rộng các ứng dụng

4. Giúp kích hoạt các kết nối thiết chặt chẽ, một yếu tố quan trọng trong lập trình ứng dụng.

Một số hạn chế của DI

1. Kỹ thuật này tương đối phức tạp để học hỏi và sử dụng, và nếu lạm dụng DI có thể dẫn đến các vấn đề về quản lý và một số vấn đề khác.

2. Có nhiều lỗi về thời gian biên dịch bị đẩy vào run-time.

3. Các DI framework được triển khai tương phản hoặc lập trình động. Hoạt động này có thể cản trở sử dụng IDE tự động, chẳng hạn như "tìm tài liệu tham khảo", "hiển thị phân cấp cuộc gọi" và tái cấu trúc an toàn. Bạn có thể triển khai DI của riêng bạn (Pure Vanilla) hoặc sử dụng các thư viện, Framework của bên thứ ba.

Thư viện và Framework triển khai DI

Spring (Java)

Google Guice (Java)

Dagger (Java và Android)

Castle Windsor (.NET)

Unity (.NET)

Thep BizFly Cloud tổng hợp

>> Có thể bạn quan tâm: Trở lại với cơ bản: OOP, Dependency Injection và Cake Pattern

Kể từ ngày 05/11/2018, VCCloud chính thức đổi tên thành BizFly Cloud - là nhà cung cấp các dịch vụ đám mây hàng đầu tại Việt Nam hiện nay với các dịch vụ nổi bật như: BizFly Cloud Server, BizFly CDN, BizFly Load Balancer, BizFly Pre-built Application, BizFly Business Mail, BizFly Simple Storage. Hãy tăng tốc thích nghi cho doanh nghiệp cùng các giải pháp công nghệ của BizFly Cloud tại đây.