Inversion of Control (IoC), Dependency Inversion và Dependency Injection
Mục tiêu giới thiệu Inversion of Control (IoC), Dependency
Inversion và mối liên quan giữa 2 khái niệm này với Dependency
Injection.
Trên Wikipedia và trong series của Rich cũng không define
chính xác IoC là gì. Inversion of Control ý muốn đề cập tới các software architecture designs có flow of
control ngược với kiến trúc cũ dạng software libraries (traditional
architecture of software libraries). Không có gì ghê gớm cả ...
:D, cứ cố hiểu đơn giản vậy là được. Trên blog của Martin Flower cũng có một
bài viết khá hay 'Inversion
of Control Containers and the Dependency Injection pattern', nếu có thời
gian thì bạn có thể tham khảo để biết quan điểm của một người chuyên nghiên cứu
về software design.
Inversion of Control in Relation to Frameworks
IoC có quan hệ với framework và code re-used. Thông thường
khi sử dụng lại code chúng ta thường call một library của ai đó. Ví dụ trong
.NET khi gọi method Math.Tan tức là make a call và tức là có control method đó
(đơn là hãy nghĩ rằng sử dụng được nó có nghĩ là control được nó).
Nhưng khi thực hiện implement một IComparable hay IEnumerable thì
.NET framework sẽ call ngược lại code implement. Trong những trường hợp này thì direction
of control bị đảo ngược: something else calling you. Ví dụ implement IComparable thì
phải implement method CompareTo. Khi chúng ta gọi hàm Sort thì .NET
framework gọi ngược lại method CompareTo mà chúng ta implement.
Inversion of Control và Dependency Injection
Hai khái niệm này thường được coi là đồng nghĩa tuy nhiên DI
chỉ là một dạng đặc biệt mô tả cách thực hiện IoC tức IoC có một phạm vi lớn hơn
DI.
Inversion of Control và CAB
CAB là một framework IoC và cho phép chúng ta thực hiện DI.
Tức CAB có thể thực hiện call us chứ không hoàn toàn là một framework
để chúng ta call method và sử dụng. Ví dụ như trong lab về module loader hàm
Load() của ModuleInit đã được CAB thực hiện.
Dependency Inversion
Một term có liên quan và dễ gây bối rối là Dependency
Inversion. Dependency Inversion còn gọi là Dependency
Inversion Principle- DIP, là wider concept của Dependency Injection.
DI chỉ là một phần trong DIP, DIP quy định cách thức mà một high-module cần thực
hiện khi sử dụng một low-module. Inversion (đảo ngược) ở đây nằm ở chỗ high
level thông thường dựa trên low level thì sẽ chuyển lại giở đây cả high level
và low level depend upon một shared abstraction. Software consultant Robert
C. Martin (tham khảo Agile Software Development, Principles,
Patterns, and Practices published by Prentice Hall 10/15/2002 ISBN-10:
0135974445) phát biểu như sau:
High level modules should not
depend upon low level modules. Both should depend upon abstractions.
Abstractions should not depend upon details. Details should depend upon
abstractions.
|
Đại khái là module cao hơn không nên phụ thuộc vào module
bên dưới. Cả hai nên dựa vào một 'trừu tượng'. 'Trừu tượng' không được phụ thuộc
vào 'chi tiết' mà 'chi tiết' sẽ phụ thuộc 'trừu tượng'.
DIP và IoC
Trong bài lab về DI chúng ta chỉ thực hiện invert
dependent giữa các classes. Chúng ta chưa thấy IoC xuất hiện rõ ràng trong
ví dụ đó. Nói chung chúng ta chưa cần đi quá sâu thay vì chỉ cần hiểu có thể
làm được gì với CAB.