Inversion Of Control Là Gì

Nhắc lại loài kiến thứcTrước khi ban đầu với Dependency Injection, các bạn có lẽ phần nhiều đã biết về hoặc ít ra là nghe nói tới SOLID principles, gần như nguyên lý thiết kế và viết code. Nguyên lý sau cùng trong SOLID chính là Dependency Inversion:

1. Những module v.i.p không nên nhờ vào vào những modules cấp thấp. Cả hai nên phụ thuộc vào abstraction.2. Interface (abstraction) không nên dựa vào vào chi tiết, mà ngược lại. ( các class tiếp xúc với nhau trải qua interface, không hẳn thông qua implementation.)Với biện pháp code thông thường, những module v.i.p sẽ gọi các module cấp thấp. Module cao cấp sẽ phụ thuộc cùng module cấp cho thấp, điều đó tạo ra các dependency. Khi module cấp thấp thay đổi, module v.i.p phải thay đổi theo. Một đổi khác sẽ kéo theo hàng loạt thay đổi, giảm khả năng bảo trì của code.

Bạn đang xem: Inversion of control là gì

*

Nếu tuân thủ theo đúng Dependendy Inversion principle, các module cùng dựa vào vào 1 interface ko đổi. Ta hoàn toàn có thể dễ dàng cố kỉnh thế, sửa thay đổi module cấp thấp mà không tác động gì tới module cấp cho cao.

Định nghĩa và khái niệm DI

Hiện nay, các lập trình viên tuyệt lẫn lộn giữa những khái niệm Dependency Inversion, Inversion of Control (IoC), Dependency Injection (DI). Cha khái niệm này tựa như nhau nhưng lại không hoàn toàn giống nhau.

*

Sự khác biệt giữa 3 tư tưởng trên:

Dependency Inversion: Đây là một nguyên tắc để thi công và viết code.Inversion of Contro: Đây là 1 trong design pattern được tạo ra để code rất có thể tuân thủ nguyên lý Dependency Inversion. Có tương đối nhiều cách lúc này pattern này: ServiceLocator, Event, Delegate, … Dependency Injection là 1 trong những cách đó.Dependency Injection: Đây là một cách để hiện thực Inversion of Control Pattern (Có thể coi nó là một trong design pattern riêng rẽ cũng được). Các module nhờ vào (dependency) sẽ tiến hành inject vào module cung cấp cao.Khi nói về DI, tức là nói tới Depedency Injection. Hiện nay, một vài DI container như Unity, StructureMap v…v, hỗ trợ bọn họ trong việc cài đặt và vận dụng Dependency Injection vào code (Sẽ nói ở bài xích sau), mặc dù vẫn có thể gọi chúng là IoC Container, ý nghĩa sâu sắc tương từ bỏ nhau.

Có thể hiểu Dependency Injection một cách dễ dàng và đơn giản như sau:

1. Những module không giao tiếp trực tiếp cùng với nhau, mà trải qua interface. Module thấp cấp sẽ implement interface, module cao cấp sẽ gọi module cấp thấp trải qua interface.* Ví dụ: Để tiếp xúc với database, ta bao gồm interface IDatabase, các module thấp cấp là XMLDatabase, SQLDatabase. Module cao cấp là CustomerBusiness đang chỉ thực hiện interface IDatabase. 2.Việc khởi tạo những module cấp thấp sẽ bởi vì DI Container thực hiện. Ví dụ: vào module CustomerBusiness, ta sẽ không khởi chế tạo ra IDatabase db = new XMLDatabase(), câu hỏi này sẽ vị DI Container thực hiện. Module CustomerBusiness sẽ không biết gì về module XMLDatabase tuyệt SQLDatabase. 3.Việc Module nào thêm với interface nào sẽ tiến hành config vào code hoặc trong tệp tin XML. 4.DI được dùng để gia công giảm sự nhờ vào giữa các module, dễ ợt hơn trong việc đổi khác module, gia hạn code với testing.*

Các dạng DI

Có 3 dạng Dependency Injection:

Constructor Injection: những dependency sẽ tiến hành container truyền vào (inject vào) 1 class trải qua constructor của class đó. Đây là biện pháp thông dụng nhất.

Setter Injection: những dependency sẽ tiến hành truyền vào 1 class trải qua các hàm Setter.

Interface Injection: Class bắt buộc inject vẫn implement 1 interface. Interface này đựng 1 hàm tên Inject. Container đã injection dependency vào 1 class thông qua việc điện thoại tư vấn hàm Inject của interface đó. Đây là cách xộc xệch và ít được thực hiện nhất.

Xem thêm: Lịch Làm Việc Bệnh Viện Vĩnh Đức Quảng Nam, Bệnh Viện Đa Khoa Vĩnh Đức

Ưu điểm và khuyết điểm của DI

Dĩ nhiên, DI không phải vạn năng, nó cũng có những ưu điểm và khuyết điểm, vị đó chưa hẳn project nào cũng nên vận dụng DI. Cùng với những dự án công trình lớn, code nhiều, DI là lắp thêm rất quan trọng để đảm bảo an toàn code dễ dàng bảo trì, dễ thế đổi. Vị vậy, phiên bản thân các framework danh tiếng như Spring, Struts2, ASP.NET MVC, … đều cung cấp hoặc tích vừa lòng sẵn DI. ASP.NET MVC từ bạn dạng 5 trở xuống cho phép ta thực hiện DI container tự thư viện, từ phiên bản 6 thì tích phù hợp sẵn DI luôn, không cần phải thêm thư viện gì.

*

Trên đây chỉ là đa số hiểu biết cơ bạn dạng của bản thân về dependency injection và inversion of control. Rất ý muốn nhận được phần lớn nhận xét từ các bạn