Đầu tiên, tôi muốn tách biệt phương pháp thiết kế khỏi khái niệm khung. Tiêm phụ thuộc ở cấp độ đơn giản và cơ bản nhất của nó chỉ đơn giản là:
Một đối tượng cha cung cấp tất cả các phụ thuộc cần thiết cho đối tượng con.
Đó là nó. Lưu ý rằng không có gì trong đó yêu cầu giao diện, khung, bất kỳ kiểu tiêm nào, v.v. Để công bằng, lần đầu tiên tôi đã tìm hiểu về mẫu này 20 năm trước. Nó không phải là mới.
Do có hơn 2 người nhầm lẫn giữa thuật ngữ cha mẹ và con cái, trong bối cảnh tiêm phụ thuộc:
- Các mẹ là đối tượng mà instantiates và cấu hình các đối tượng trẻ em nó sử dụng
- Các con là thành phần được thiết kế để được khởi tạo một cách thụ động. Tức là nó được thiết kế để sử dụng bất kỳ phụ thuộc nào được cung cấp bởi cha mẹ và không khởi tạo các phụ thuộc của chính nó.
Phụ thuộc tiêm là một mô hình cho thành phần đối tượng .
Tại sao giao diện?
Giao diện là một hợp đồng. Chúng tồn tại để hạn chế mức độ kết hợp chặt chẽ giữa hai đối tượng. Không phải mọi phụ thuộc đều cần một giao diện, nhưng chúng giúp viết mã mô-đun.
Khi bạn thêm vào khái niệm kiểm thử đơn vị, bạn có thể có hai triển khai khái niệm cho bất kỳ giao diện cụ thể nào: đối tượng thực bạn muốn sử dụng trong ứng dụng của mình và đối tượng bị nhạo báng hoặc sơ khai mà bạn sử dụng để kiểm tra mã phụ thuộc vào đối tượng. Điều đó một mình có thể đủ biện minh cho giao diện.
Tại sao khung?
Về cơ bản, việc khởi tạo và cung cấp các phụ thuộc cho các đối tượng con có thể gây nản chí khi có một số lượng lớn chúng. Các khung cung cấp các lợi ích sau:
- Tự động phụ thuộc vào các thành phần
- Cấu hình các thành phần với các thiết lập của một số loại
- Tự động hóa mã tấm nồi hơi để bạn không phải nhìn thấy nó được viết ở nhiều vị trí.
Họ cũng có những nhược điểm sau:
- Đối tượng cha là một "thùng chứa" và không có gì trong mã của bạn
- Nó làm cho việc kiểm tra trở nên phức tạp hơn nếu bạn không thể cung cấp các phụ thuộc trực tiếp trong mã kiểm tra của mình
- Nó có thể làm chậm quá trình khởi tạo vì nó giải quyết tất cả các phụ thuộc bằng cách sử dụng sự phản chiếu và nhiều thủ thuật khác
- Việc gỡ lỗi thời gian chạy có thể khó khăn hơn, đặc biệt nếu container chứa proxy giữa giao diện và thành phần thực tế thực hiện giao diện (lập trình hướng theo khía cạnh được tích hợp trong Spring). Hộp chứa là một hộp đen và chúng không phải luôn được chế tạo với bất kỳ khái niệm nào tạo thuận lợi cho quá trình gỡ lỗi.
Tất cả những gì đã nói, có sự đánh đổi. Đối với các dự án nhỏ, nơi không có nhiều bộ phận chuyển động và có ít lý do để sử dụng khung DI. Tuy nhiên, đối với các dự án phức tạp hơn, nơi đã có một số thành phần nhất định được thực hiện cho bạn, khung có thể được biện minh.
Còn [bài viết ngẫu nhiên trên Internet] thì sao?
Còn nó thì sao? Nhiều lần mọi người có thể trở nên quá nhiệt tình và thêm một loạt các hạn chế và đánh cược bạn nếu bạn không làm mọi thứ theo "một cách thực sự". Không có một cách đúng. Xem nếu bạn có thể trích xuất bất cứ điều gì hữu ích từ bài viết và bỏ qua những thứ bạn không đồng ý.
Tóm lại, hãy suy nghĩ cho bản thân và thử mọi thứ.
Làm việc với "những cái đầu cũ"
Tìm hiểu càng nhiều càng tốt. Những gì bạn sẽ tìm thấy với rất nhiều nhà phát triển đang làm việc ở độ tuổi 70 là họ đã học được cách không giáo điều về rất nhiều thứ. Họ có những phương pháp mà họ đã làm việc trong nhiều thập kỷ để tạo ra kết quả chính xác.
Tôi đã có đặc quyền làm việc với một vài trong số này, và họ có thể cung cấp một số phản hồi trung thực một cách tàn nhẫn có nhiều ý nghĩa. Và nơi họ thấy giá trị, họ thêm những công cụ đó vào tiết mục của mình.