Chìa khóa của container DI là sự trừu tượng . DI container trừu tượng thiết kế này quan tâm cho bạn. Như bạn có thể đoán, nó có tác động đáng chú ý đến mã, thường được dịch sang số lượng ít hơn các nhà xây dựng, setters, nhà máy và nhà xây dựng. Do đó, chúng làm cho mã của bạn được ghép lỏng hơn (do IoC cơ bản ), sạch hơn và đơn giản hơn. Mặc dù không phải không có chi phí.
Hình nền
Nhiều năm trước, sự trừu tượng như vậy đòi hỏi chúng ta phải viết các tệp cấu hình khác nhau ( lập trình khai báo ). Thật tuyệt vời khi thấy số lượng LỘC giảm đáng kể, nhưng trong khi các LỘC giảm, số lượng tệp cấu hình tăng nhẹ. Đối với các dự án vừa hoặc nhỏ thì hoàn toàn không phải là vấn đề, nhưng đối với các dự án lớn hơn, việc "lắp ráp mã" nằm rải rác 50% giữa các mô tả mã và XML đã trở thành một vấn đề trong ... Tuy nhiên, vấn đề chính là mô hình chính nó. Nó khá không linh hoạt bởi vì các mô tả để lại không gian nhỏ cho các tùy chỉnh.
Mô hình chuyển dần sang quy ước về cấu hình , giao dịch các tệp cấu hình cho các chú thích hoặc thuộc tính. Nó giữ cho mã của chúng tôi sạch hơn và đơn giản hơn trong khi cung cấp cho chúng tôi tính linh hoạt mà XML không thể.
Có lẽ, đây là sự khác biệt đáng kể nhất liên quan đến cách bạn làm việc cho đến bây giờ. Ít mã hơn và nhiều phép thuật hơn.
Về mặt nhược điểm...
Quy ước về cấu hình làm cho sự trừu tượng nặng nề đến mức bạn hầu như không biết nó hoạt động như thế nào. Đôi khi có vẻ kỳ diệu và ở đây có thêm một nhược điểm. Khi đã hoạt động, nhiều nhà phát triển không quan tâm đến cách thức hoạt động của nó.
Đây là một điểm chấp cho những người đã học DI với các thùng chứa DI. Họ không hiểu đầy đủ về sự liên quan của các mẫu thiết kế, các thông lệ tốt và các nguyên tắc được trừu tượng hóa bởi container. Tôi đã hỏi các nhà phát triển nếu họ quen thuộc với DI và các ưu điểm của nó và họ trả lời: - Vâng, tôi đã sử dụng Spring IoC -. (Nó có nghĩa là gì?!?)
Người ta có thể đồng ý hoặc không với mỗi "nhược điểm" này. Theo ý kiến khiêm tốn của tôi, cần phải biết những gì đang diễn ra trong dự án của bạn. Mặt khác, chúng ta không có sự hiểu biết đầy đủ về nó. Ngoài ra là để biết DI dùng để làm gì và có một khái niệm về cách thực hiện nó là một điểm cộng cần xem xét.
Về mặt tích cực ...
Năng suất một từ . Các khung cho phép chúng tôi tập trung vào những gì thực sự quan trọng. Ứng dụng của doanh nghiệp.
Mặc dù thiếu sót nhận xét, đối với nhiều người trong chúng ta (công việc được quy định bởi thời hạn và chi phí), những công cụ này là một nguồn tài nguyên vô giá. Theo tôi, đây nên là đối số chính của chúng tôi ủng hộ việc triển khai các thùng chứa DI. Năng suất .
Kiểm tra
Cho dù chúng tôi triển khai DI hoặc container thuần túy, việc kiểm tra sẽ không thành vấn đề. Hoàn toàn ngược lại. Các thùng chứa tương tự thường cung cấp cho chúng tôi các mô hình thử nghiệm đơn vị ra khỏi hộp. Trong những năm qua, tôi đã sử dụng các bài kiểm tra của mình như nhiệt kế. Họ nói với tôi nếu tôi phụ thuộc nhiều vào các cơ sở container. Tôi nói điều này bởi vì các container này có thể khởi tạo các thuộc tính riêng mà không cần setters hoặc constructor. Họ có thể tiêm các thành phần gần như ở bất cứ nơi nào!
Nghe có vẻ hấp dẫn phải không? Hãy cẩn thận! Đừng rơi vào bẫy !!
Gợi ý
Nếu bạn quyết định triển khai các container, tôi thực sự khuyên bạn nên gắn bó với các thông lệ tốt. Tiếp tục thực hiện các hàm tạo, setters và giao diện. Thực thi khung / container để sử dụng chúng . Nó sẽ làm cho việc di chuyển dễ dàng hơn có thể sang khung khác hoặc loại bỏ khung thực tế. Nó có thể làm giảm đáng kể sự phụ thuộc vào container.
Về thực hành này:
Khi nào nên sử dụng container DI
Câu trả lời của tôi sẽ bị thiên vị bởi kinh nghiệm của bản thân, chủ yếu thiên về các thùng chứa DI (như tôi đã nhận xét, tôi tập trung rất nhiều vào năng suất, vì vậy tôi chưa bao giờ có nhu cầu về DI thuần túy. Hoàn toàn ngược lại).
Tôi nghĩ bạn sẽ tìm thấy bài viết thú vị của Mark Seeman về chủ đề này, cũng trả lời câu hỏi liên quan đến cách thực hiện DI thuần túy .
Cuối cùng, nếu chúng ta đang nói về Java, trước tiên tôi sẽ xem xét việc xem xét JSR330 - Dependency Injection .
Tóm tắt
Lợi ích :
- Cắt giảm chi phí và tiết kiệm thời gian. Năng suất.
- Một số lượng nhỏ hơn của các thành phần.
- Mã trở nên đơn giản và sạch sẽ hơn.
Hạn chế :
- DI được ủy quyền cho libs bên thứ 3. Chúng ta nên nhận thức được sự đánh đổi, điểm mạnh và điểm yếu của họ.
- Đường cong học tập.
- Chúng nhanh chóng khiến bạn quên đi một số thói quen tốt.
- Tăng sự phụ thuộc của dự án (nhiều lib hơn)
- Các container dựa trên sự phản chiếu đòi hỏi nhiều tài nguyên hơn (bộ nhớ). Điều này rất quan trọng nếu chúng ta bị hạn chế bởi các nguồn lực.
Sự khác biệt với DI thuần túy :
- Ít mã hơn và nhiều tập tin cấu hình hoặc chú thích.