Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
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:
- Tài xế => Client class
- Chiếc xe => Service (Dependency)
- 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





