Làm thế nào để tiêm phụ thuộc làm tăng khớp nối?


32

Trên trang Wikipedia về tiêm phụ thuộc, phần nhược điểm cho chúng ta biết điều này:

Sự phụ thuộc tiêm làm tăng sự ghép đôi bằng cách yêu cầu người dùng của một hệ thống con cung cấp cho các nhu cầu của hệ thống con đó.

với một liên kết đến một bài báo chống lại sự phụ thuộc tiêm .

Sự phụ thuộc tiêm làm cho một lớp sử dụng giao diện thay vì thực hiện cụ thể. Điều đó sẽ dẫn đến giảm khớp nối , không?

Tôi đang thiếu gì? Làm thế nào là tiêm phụ thuộc tăng khớp nối giữa các lớp?


2
Tôi không chắc ai đã viết ra danh sách những bất lợi đó, nhưng tôi sẽ dùng nó với một hạt muối. Ví dụ, tôi đã thấy DI giảm kích thước của cơ sở mã xuống 2/3 bằng cách loại bỏ một tấn mã thiết lập dự phòng.
Rob

@RobY Tôi chủ yếu sử dụng nhà máy để tiêm phụ thuộc và kinh nghiệm của tôi là nó tăng kích thước mã, nhưng đơn giản hóa việc kiểm tra.
BЈовић

Hãy thử sử dụng một giải pháp thay thế như Registry hoặc Context Passing;) Hoặc mã khác chỉ khởi tạo các đối tượng và sau đó kéo các thuộc tính của chúng khỏi cấu hình. Chủ yếu, tôi đang nói về sự khác biệt giữa bây giờ và 15 năm trước.
Rob

Liên quan: stackoverflow.com/a/9503612/264697 . Câu trả lời của Mark Seemann giải thích cách giảm khớp nối tổng thể bằng cách sử dụng Dependency Injection.
Steven

Câu trả lời:


42

Vì vậy, tôi đang thiếu gì?

Dependency Injection làm giảm sự ghép nối giữa một lớp và sự phụ thuộc của nó. Nhưng nó làm tăng sự kết hợp giữa một lớp và người tiêu dùng của nó (vì người tiêu dùng cần thêm thông tin để tạo ra nó) và sự phụ thuộc và người tiêu dùng của nó (vì người tiêu dùng cần biết sự phụ thuộc để sử dụng).

Rất thường xuyên, đây là một sự đánh đổi tốt. Lớp không nên biết chi tiết về các phụ thuộc của nó ngoài giao diện và ứng dụng phải có trách nhiệm buộc các bit mã cụ thể lại với nhau.


Phải, khớp nối được giảm một cách và tăng một cách khác.
Paul Draper

Nhưng người tiêu dùng không tạo ra nó; đó là điểm chính.
Casey

@emodendroket - Ơ? Inversion of Control cho phép người tiêu dùng không tạo ra nó. Dependency Injection là trực giao với điều đó.
Telastyn

Chà, bạn đang làm một sự khác biệt Tôi không quen thuộc, vì thông thường các thuật ngữ được sử dụng thay thế cho nhau.
Casey

22

Giả sử bạn có một hệ thống con Sphụ thuộc vào kết nối cơ sở dữ liệu D. Không có sự phụ thuộc tiêm, có một khớp nối tương đối chặt chẽ giữa SD, bởi vì Scần biết cả cách sử dụng Dvà cách tạo ra nó. Phần còn lại của hệ thống, tuy nhiên, có thể hạnh phúc không biết về sự phụ thuộc này giữa SD.

Với phép tiêm phụ thuộc, khớp nối giữa SDtrở nên lỏng lẻo hơn, bởi vì bạn loại bỏ Skiến thức về cách tạo a D. Schỉ cần biết làm thế nào để sử dụng nó. Sự kết hợp tổng thể tăng lên xuất phát từ thực tế là các bộ phận khác của hệ thống hiện nay cần biết Dvà có thể làm thế nào để tạo ra một. Mức độ gia tăng của khớp nối này phụ thuộc vào mức độ phụ thuộc vào Dđược tiêm vào S:

  • Với constructor tiêm , người tạo Scần một sự phụ thuộc Dvà có thể là kiến ​​thức về cách tạo ra nó.
  • Với phương pháp tiêm cấp độ phương thức , mỗi người gọi một phương thức Smà qua đó một người Dđược tiêm cần một sự phụ thuộc Dvà có thể là kiến ​​thức về cách tạo ra một phương thức.

Trong cả hai trường hợp, số lượng các lớp học phụ thuộc vào Dsự gia tăng và kiến ​​thức về cách tạo ra một Dvẫn cần phải có mặt ở đâu đó trong hệ thống. Điều này tạo ra sự gia tăng tổng thể của khớp nối.


Ok, nó có ý nghĩa đối với constructor và setter tiêm. Nhưng nếu một người sử dụng mô hình nhà máy hoặc chiến lược, thì việc tạo được chuyển đến đó và lớp chỉ sử dụng đối tượng được chèn. Hoặc, đó không phải là tiêm phụ thuộc (chỉ đảo ngược kiểm soát)?
BЈовић

Ngay cả với việc tiêm tại nhà máy, người tạo ra Snhu cầu cung cấp cho một nhà máy D, điều đó có nghĩa là nó cần phải biết rằng Ssử dụng D(hoặc ít nhất là một số giao diện của nó).
Idan Arye

7

Tôi hoàn toàn không đồng ý rằng nó làm tăng khớp nối.

Không có sự phụ thuộc tiêm, bạn có sự kết hợp chặt chẽ giữa một hệ thống phụ và việc thực hiện cụ thể của sự phụ thuộc.

Với tiêm phụ thuộc, bạn đã tách hệ thống phụ khỏi việc thực hiện phụ thuộc.

Việc đưa ra lập luận rằng nó làm tăng sự ghép nối giữa người tiêu dùng và hệ thống phụ này là RẤT đáng nghi ngờ vì nó ngụ ý rằng người tiêu dùng hiện đang liên kết chặt chẽ với sự phụ thuộc theo yêu cầu của hệ thống phụ. Tất cả điều đó có nghĩa là bạn đang viết mã kết hợp chặt chẽ mà kết hợp người tiêu dùng của bạn với sự phụ thuộc. Lý tưởng nhất là TẤT CẢ mã của bạn được tách rời.

Xây dựng tiêm:

Độ phân giải phụ thuộc được xử lý bởi một thùng chứa phụ thuộc hoặc nhà máy. Người tiêu dùng có thể có được một triển khai cụ thể của hệ thống phụ từ thùng chứa phụ thuộc hoặc nhà máy.

Người tiêu dùng không cần biết hàm tạo của hệ thống phụ trông như thế nào. Không có khớp nối với phụ thuộc hệ thống phụ.

Phương pháp tiêm:

Giống như tiêm constructor ngoại trừ bây giờ người tiêu dùng cần lấy một ví dụ cụ thể về sự phụ thuộc từ container hoặc nhà máy (hoặc thậm chí có phương thức / constructor được tiêm) và tiêm vào phương thức. Một lần nữa, người tiêu dùng không được kết hợp với việc thực hiện cụ thể của sự phụ thuộc.

TL; DR Trường hợp tồi tệ nhất đối với việc tiêm phụ thuộc trong một hệ thống phụ là khớp nối được chuyển sang mã tiêu dùng. KHÔNG CÓ TĂNG CƯỜNG TUYỆT VỜI TRONG HỢP TÁC.

Trường hợp tốt nhất là tất cả các hệ thống hiện được ghép lỏng lẻo và tiêm phụ thuộc được kiểm soát thông qua các thùng chứa phụ thuộc hoặc nhà máy.

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.