Chức năng của Dependency Injection

Có 3 chức năng của dependency injection mà bạn cần quan tâm

  • Khởi tạo service (Object composition)
  • Can thiệp service (Interception)
  • Quản lý vòng đời object (Object Lifetime Management)

Khởi tạo service

Theo nguyên tắc Single Responsible Principle trong SOLID, client class không nên quan tâm về việc khởi tạo service. Client class chỉ cần sử dụng object được injected vào thông qua constructor, còn việc khởi tạo service sẽ nằm ở bên ngoài nơi được gọi là Composition Root, thường thấy ở hàm Main(), class App, class Kernel. Composition Root có 4 nhiệm vụ:

  • Load file config
  • Tạo ra các object
  • Gọi một số hàm chính
  • Dọn dẹp các object hết sử dụng (object disposal)

Ví dụ: Có tài xế taxi muốn kiếm ít tiền nên nương nhờ 1 nhà xe. Lúc này ta có 3 đối tượng ứng với 3 đối tượng của dependency injection như sau:

  1. Tài xế => Client class
  2. Chiếc xe => Service (Dependency)
  3. Nhà xe => Composition Root, Dependency Injector

Tài xế muốn thực hiện nhiệm vụ duy nhất của mình (Single Responsibiliy Principle) là chở khách đi làm, chiếc xe là service giúp tài xế làm việc đó, tài xế phụ thuộc vào chiếc xe (depent). Nhà xe đứng ra chịu trách nhiệm vận hành chung (Single Responsible Principle của nhà xe).
Nhà xe sẽ làm việc khởi tạo service là mua hàng loạt xe (tạo các objects), setup đồ chơi (load configuration), gọi tài xế khi có khách (gọi hàm chính), cất xe khi ko tài xế nào sử dụng (object disposal)

Can thiệp vào service

Bằng cách sử dụng Decorator pattern, chúng ta có thể điều chỉnh service, thêm thắt một số chức năng, trước khi đưa vào cho client class.
Ví dụ, chúng ta muốn có chức năng theo dõi hành trình xe. bằng cách áp dụng Dependency Injection, người lái xe (client class) sẽ không cần quan tâm đến việc làm thế nào để setup camera, hay thậm chí không cần quan tâm là cái camera có tồn tại hay không, miễn là bằng cách nào đó nó được gắn vào xe là được. Nhiệm vụ chính của tài xế là dùng chiếc xe (service) để đạt được mục đích là chở khách từ nhà đến chỗ làm việc. Nhà xe (Composition Root) sẽ chịu trách nhiệm gắn camera vào chiếc xe và tuỳ chỉnh thông số phù hợp mà không cần thông báo cho tài xế biết (client class). Cuối cùng, sau khi tài xế hoàn thành cuốc xe, nhà xe có được thước video về hành trình chiếc xe.
Khi làm điều này, chúng ta đã tuân theo 2 principle trong SOLID:

  • Single Responsibility Principle: Tài xế chỉ quan tâm đến việc lái xe
  • Open/Close Principle: Chúng ta thêm camera hành trình mà không làm ảnh hưởng đến tài xế cũng như chiếc xe(close for modification), ta chỉ gắn thêm camera bên ngoài chiếc xe mà thôi, với điều kiện là chiếc xe có để hở 1 số ổ cắm điện (open for extension) Thông thường chúng ta hay sử dụng việc can thiệp (interception) để làm một số chức năng chung (cross-cutting concerns) như logging, auditing, validation, security và caching, những chức năng được xài lại trên toàn hệ thống nhưng lại không phải là chức năng chính của app.

Quản lý vòng đời object

Client class không quan tâm đến việc khởi tạo, thì cũng không quan tâm đến việc khi nào thì nên huỷ object. Việc huỷ object là nhiệm vụ của Composition Root. Có như vậy các client class sẽ yên tâm xài chung service mà không sợ vô tình huỷ object khi client class khác vẫn đang sử dụng service bị huỷ.
Trong ví dụ của ta là tài xế chạy xong cuốc xe không phải lo việc tháo dỡ cái camera hành trình, tháo mất lỡ tài xế sau lại cần thì sao? Việc lắp đặt hay tháo dỡ cái camera cứ để nhà xe lo.

votanlean 31-05-2020

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Le An

3 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 2
Giả sử bạn đang cần tạo mới user và không biết là Linux cung cấp lệnh gì phù hợp. Bạn có thể gõ câu lệnh sau: sh $ man k user | grep 8 | grep cre...
Le An viết 8 tháng trước
5 2
White
1 0
Làm lập trình một thời gian có thể bạn sẽ nghe nói đến thuật ngữ "Dependency Injection". Hôm nay mình sẽ nói sơ qua để bạn có cái nhìn tổng quan ch...
Le An viết 8 tháng trước
1 0
Bài viết liên quan
Male avatar
11 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết hơn 4 năm trước
11 5
White
0 5
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết hơn 2 năm trước
0 5
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!