Đảo ngược kiểm soát liên quan đến nghịch đảo phụ thuộc như thế nào


11

Trong nhiều bài viết trên web, các thuật ngữ Inversion of Control and Dependency Inversion Nguyên tắc dường như được trộn lẫn và được sử dụng như các từ đồng nghĩa (sự nhầm lẫn thêm được thực thi bởi các công cụ được gọi là "DI-Container" và "IoC-Container"). Một bài viết trên Wikipedia thực hiện một công việc tuyệt vời khi cố gắng giải thích rằng IoC không giống như DI:

đảo ngược điều khiển (IoC) mô tả một thiết kế trong đó các phần được viết tùy chỉnh của chương trình máy tính nhận luồng điều khiển từ một thư viện chung, có thể sử dụng lại

Vì vậy, DIP là về việc các mô-đun của bạn phụ thuộc vào trừu tượng hơn là triển khai cụ thể.

Và IoC là về việc trao quyền kiểm soát luồng chương trình của bạn cho một mô-đun riêng biệt. Và một trong những điều bạn có thể có mô-đun này làm là giải quyết các phụ thuộc khi chạy.

Sự khác biệt này có vẻ công bằng, nhưng tôi chưa bao giờ thấy ai đề cập đến bất kỳ ứng dụng nào khác của nguyên tắc IoC ngoài việc giải quyết phụ thuộc. Định nghĩa Wikipedia khá rộng và có vẻ như bạn có thể làm được nhiều hơn thế với một mô-đun có thể thực hiện các cuộc gọi vào mã tùy chỉnh của bạn dựa trên cấu hình của nó và một số logic bên trong.

Vì vậy, đây là một số câu hỏi mà tôi chưa thể tìm ra:

  • Mối quan hệ thực tế giữa IoC và DIP là gì? Có phải IoC luôn đóng vai trò là phương tiện để thực hiện DIP?
  • Tại sao các công cụ để giải quyết sự phụ thuộc được gọi là cả DI- và IoC-container? Điều này ngụ ý rằng DI và IoC là cùng một thứ.

Lưu ý : Câu hỏi này không phải là một bản sao của Sự khác biệt giữa DI và IoC là gì , bởi vì câu hỏi sau hỏi về Dependency Injection, không phải Dependency Inversion.


Bản sao có thể có của sự khác biệt giữa DI và IoC là gì?
gnat

@gnat, không, không, xin vui lòng xem bản chỉnh sửa của tôi
Andre Borges

đồng ý, tôi đã bỏ lỡ điều đó xin lỗi
gnat

2
IMO, câu trả lời đơn giản là "chúng giống nhau". IoC là một tên gọi khác của đảo ngược phụ thuộc và cả hai đều là một cách để đạt được tiêm phụ thuộc. Tôi thấy "nghịch đảo phụ thuộc" là một thuật ngữ không có ích vì nó quá dễ bị nhầm lẫn với tiêm. Vì vậy, có DI (tiêm) và IoC là một cách để đạt được sự đảo ngược của các phụ thuộc / kiểm soát thông qua tiêm.
David Arno

Câu trả lời:


6

Có một bài viết tuyệt vời trên trang web của Martin Fowler có một chương cụ thể về sự khác biệt giữa DIP, DI và IoC . Ý chính của nó (như được sao chép từ trang web đó) là

DI là về cách một đối tượng có được sự phụ thuộc. Khi một phụ thuộc được cung cấp bên ngoài, thì hệ thống đang sử dụng DI. IoC là về người bắt đầu cuộc gọi. Nếu mã của bạn bắt đầu một cuộc gọi, thì đó không phải là IoC, nếu container / hệ thống / thư viện gọi lại mã mà bạn đã cung cấp, đó có phải là IoC.

Mặt khác, DIP là về mức độ trừu tượng trong các tin nhắn được gửi từ mã của bạn đến thứ mà nó đang gọi. Để chắc chắn, sử dụng DI hoặc IoC với DIP có xu hướng biểu cảm hơn, mạnh mẽ hơn và liên kết miền, nhưng chúng là về các kích thước hoặc lực khác nhau, trong một vấn đề tổng thể. DI là về hệ thống dây điện, IoC là về hướng và DIP là về hình dạng.


2
IoC là về người bắt đầu cuộc gọi - ai thực hiện cuộc gọi này để làm gì? Nếu tôi viết ISomeInterface object = container.Resolve<ISomeInterface>()có phải là IoC hay không?
Andre Borges

1
Những gì bạn viết là một triển khai trong mẫu định vị dịch vụ. Đây cũng là IoC. Không phải IoC là đối tượng ISomeInterface = new MyClass (). Vì vậy, cuộc gọi có nghĩa là "cuộc gọi đến khởi tạo" (hoặc ai gọi 'mới').
Sjoerd222888 3/03/2016

1
"Mặt khác, DIP là về mức độ trừu tượng trong các tin nhắn được gửi từ mã của bạn đến thứ mà nó đang gọi." Nghe có vẻ vô nghĩa với tôi. Đâu là sự đảo ngược trong đó? Ông mô tả sự trừu tượng phụ thuộc, không đảo ngược.
David Arno

@DavidArno, bạn đang nói rằng chúng tôi không thể tin tưởng trang web của Martin Fowler?
Holdenmcgrohen 3/03/2016

@keepenmcgrohen, đó là ý kiến ​​của anh ấy về mọi thứ. Chỉ vì đó là Martin Fowler, không biến nó thành sự thật. Đôi khi anh ấy sai IMO, ví dụ liên quan đến "mô hình dữ liệu thiếu máu". Lần khác, anh rất sâu sắc. Nhân dịp này tôi nghĩ anh ấy cũng sai vì nó không có ý nghĩa.
David Arno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.