Ngoài các khuôn khổ tiêm phụ thuộc, tiêm phụ thuộc (thông qua tiêm xây dựng hoặc tiêm setter) gần như là một trò chơi tổng bằng không: bạn giảm khớp nối giữa đối tượng A và đó là phụ thuộc B, nhưng bây giờ bất kỳ đối tượng nào cần một thể hiện của A cũng xây dựng đối tượng B.
Bạn đã giảm nhẹ khớp nối giữa A và B, nhưng giảm đóng gói của A và tăng khớp nối giữa A và bất kỳ lớp nào phải xây dựng một thể hiện của A, bằng cách ghép chúng với các phụ thuộc của A.
Vì vậy, tiêm phụ thuộc (không có khung) cũng có hại như nhau vì nó hữu ích.
Tuy nhiên, chi phí bổ sung thường dễ dàng được chứng minh: nếu mã khách hàng biết nhiều hơn về cách xây dựng sự phụ thuộc so với chính đối tượng, thì việc tiêm phụ thuộc thực sự sẽ làm giảm sự ghép đôi; ví dụ, Máy quét không biết nhiều về cách lấy hoặc xây dựng luồng đầu vào để phân tích cú pháp đầu vào hoặc nguồn mã khách muốn phân tích đầu vào từ đâu, do đó, hàm xây dựng của luồng đầu vào là giải pháp rõ ràng.
Kiểm tra là một biện minh khác, để có thể sử dụng phụ thuộc giả. Điều đó có nghĩa là thêm một hàm tạo bổ sung được sử dụng để chỉ kiểm tra cho phép các phần phụ thuộc được thêm vào: nếu thay vào đó, bạn thay đổi các hàm tạo của mình để luôn luôn yêu cầu các phần phụ thuộc được chèn vào, đột nhiên, bạn phải biết về các phần phụ thuộc của phần phụ thuộc của bạn để xây dựng phần phụ thuộc của bạn phụ thuộc trực tiếp và bạn không thể hoàn thành công việc.
Nó có thể hữu ích, nhưng bạn chắc chắn nên tự hỏi mình cho từng phụ thuộc, liệu lợi ích thử nghiệm có xứng đáng với chi phí không, và tôi có thực sự muốn chế giễu sự phụ thuộc này trong khi thử nghiệm không?
Khi một khung tiêm phụ thuộc được thêm vào và việc xây dựng các phụ thuộc được ủy thác không phải cho mã khách hàng mà thay vào đó là khung, phân tích chi phí / lợi ích thay đổi rất nhiều.
Trong khuôn khổ tiêm phụ thuộc, sự đánh đổi có một chút khác biệt; những gì bạn đang mất bằng cách tiêm phụ thuộc là khả năng dễ dàng biết bạn đang dựa vào việc triển khai nào và chuyển trách nhiệm quyết định sự phụ thuộc nào bạn đang dựa vào một số quy trình giải quyết tự động (ví dụ: nếu chúng tôi yêu cầu @ Tiêm Foo , phải có một cái gì đó mà @Provides Foo và có sẵn các phụ thuộc được tiêm) hoặc một số tệp cấu hình cấp cao quy định nhà cung cấp nào sẽ được sử dụng cho mỗi tài nguyên hoặc cho một số kết hợp của hai tài nguyên (ví dụ: có thể là một quá trình giải quyết tự động cho các phụ thuộc có thể bị ghi đè, nếu cần, sử dụng tệp cấu hình).
Như trong tiêm chích xây dựng, tôi nghĩ rằng lợi thế của việc này lại kết thúc, rất giống với chi phí thực hiện: bạn không cần phải biết ai đang cung cấp dữ liệu mà bạn dựa vào và nếu có nhiều tiềm năng nhà cung cấp, bạn không cần phải biết thứ tự ưu tiên để kiểm tra nhà cung cấp, đảm bảo rằng mọi vị trí cần kiểm tra dữ liệu cho tất cả các nhà cung cấp tiềm năng, v.v., bởi vì tất cả các điều đó được xử lý ở mức cao bằng cách tiêm phụ thuộc nền tảng.
Mặc dù cá nhân tôi không có nhiều kinh nghiệm với các khung DI, nhưng ấn tượng của tôi là chúng mang lại nhiều lợi ích hơn chi phí khi đau đầu tìm nhà cung cấp chính xác dữ liệu hoặc dịch vụ mà bạn cần có chi phí cao hơn đau đầu, khi một cái gì đó không thành công, không biết ngay tại địa phương mã nào đã cung cấp dữ liệu xấu gây ra lỗi sau đó trong mã của bạn.
Trong một số trường hợp, các mẫu khác che khuất sự phụ thuộc (ví dụ: bộ định vị dịch vụ) đã được áp dụng (và có lẽ cũng đã chứng minh giá trị của chúng) khi các khung DI xuất hiện trên hiện trường và các khung DI được áp dụng vì chúng mang lại một số lợi thế cạnh tranh, như yêu cầu ít mã soạn sẵn, hoặc có khả năng làm ít hơn để che khuất nhà cung cấp phụ thuộc khi cần thiết để xác định nhà cung cấp nào thực sự được sử dụng.