2009-02-10 17 views
16

Việc tiêm phụ thuộc có nghĩa là bạn không bao giờ cần từ khóa 'mới'? Hoặc là hợp lý để trực tiếp tạo ra các lớp lá đơn giản như bộ sưu tập?Có bao giờ xảy ra trường hợp 'mới' khi sử dụng tính năng tiêm phụ thuộc không?

Trong ví dụ dưới đây tôi tiêm so sánh, truy vấn và dao, nhưng SortedSet được trực tiếp instantiated:

public Iterable<Employee> getRecentHires() 
{ 
    SortedSet<Employee> entries = new TreeSet<Employee>(comparator); 
    entries.addAll(employeeDao.findAll(query)); 
    return entries; 
} 

Trả lời

9

Chỉ vì Dependency Injection là một mô hình hữu ích không có nghĩa là chúng ta sử dụng nó cho tất cả mọi thứ. Ngay cả khi sử dụng DI, thường cần có mới. Chưa xóa mới.

0

Có, tất nhiên.

Tiêm phụ thuộc có nghĩa là trong trường hợp có thể có một số mục tiêu tức thời có thể mà khách hàng có thể không biết (hoặc có khả năng đưa ra lựa chọn) về thời gian biên dịch.

Tuy nhiên, có đủ tình huống mà bạn biết chính xác những gì bạn muốn khởi tạo, vì vậy không cần DI.

Điều này giống như gọi hàm trong ngôn ngữ hướng đối tượng: chỉ vì bạn có thể sử dụng liên kết động, không có nghĩa là bạn không thể sử dụng điều phối tĩnh cũ tốt (ví dụ: khi bạn tách phương thức của mình thành một số thao tác riêng).

4

Không có gì sai khi sử dụng mới như cách hiển thị trong đoạn mã của bạn.

Cân nhắc trường hợp muốn nối thêm Đoạn mã. Tại sao bạn muốn hỏi các vòi phun cho một StringBuilder?

Trong tình huống khác mà tôi đã gặp phải, tôi cần có một chuỗi chạy theo chu kỳ của thùng chứa của tôi. Trong trường hợp đó, tôi phải thực hiện một đề tài mới () vì Injector của tôi đã được tạo sau khi phương thức gọi lại để khởi động vùng chứa được gọi. Và một khi kim phun đã sẵn sàng, tôi đã tiêm một số lớp được quản lý vào lớp con Thread của tôi.

6

Một cách mà tôi thường quyết định có sử dụng tiêm phụ thuộc hay không là tôi có cần giả lập hoặc phân tích lớp cộng tác khi viết một bài kiểm tra đơn vị cho lớp đang được kiểm tra hay không. Ví dụ, trong ví dụ của bạn bạn (chính xác) đang tiêm DAO bởi vì nếu bạn viết một bài kiểm tra đơn vị cho lớp của bạn, bạn có thể không muốn bất kỳ dữ liệu nào thực sự được ghi vào cơ sở dữ liệu. Hoặc có lẽ một lớp cộng tác viết các tệp vào hệ thống tệp hoặc phụ thuộc vào tài nguyên bên ngoài. Hoặc hành vi là không thể đoán trước hoặc khó tính trong một bài kiểm tra đơn vị. Trong những trường hợp đó, tốt nhất là tiêm những phụ thuộc đó.

Để cộng tác các lớp học như TreeSet, tôi thường không tiêm những thứ này vì thường không cần phải thử các lớp đơn giản như thế này.

Một lưu ý cuối cùng: khi một trường không thể được tiêm vì bất kỳ lý do gì, nhưng tôi vẫn muốn thử nó trong một bài kiểm tra, tôi đã tìm thấy lớp Junit-addons PrivateAccessor hữu ích để có thể chuyển trường riêng tư của lớp thành mô hình đối tượng được tạo bởi EasyMock (hoặc jMock hoặc bất kỳ khung mocking nào khác mà bạn thích).

+0

Mùa xuân cũng có lớp 'ReflectionTestUtils' cho các hoạt động trên các thành viên riêng tư. –

0

Suy nghĩ của tôi là DI là tuyệt vời và tuyệt vời để các lớp dây và cũng là phần mã của bạn cần sto linh hoạt để thay đổi tiềm năng. Chắc chắn chúng ta có thể nói tất cả mọi thứ có thể có khả năng cần thay đổi, nhưng tất cả chúng ta đều biết trong thực tế một số công cụ chỉ sẽ không được xúc động.

Vì vậy, khi DI quá mức, tôi sử dụng 'mới' và chỉ để cuộn.

Ví dụ: đối với tôi nối dây Mô hình với Chế độ xem đến lớp Trình điều khiển .. nó luôn được thực hiện qua DI. Bất kỳ Thuật toán nào mà ứng dụng của tôi sử dụng, DI và cũng có bất kỳ mã phản chiếu có thể cắm được nào, DI. Cơ sở dữ liệu lớp .. DI nhưng khá nhiều bất kỳ đối tượng khác đang được sử dụng trong hệ thống của tôi được xử lý với một phổ biến 'mới'.

hy vọng điều này sẽ hữu ích.

0

Đúng là trong ngày hôm nay, môi trường định hướng khung mà bạn nhanh chóng thể hiện các đối tượng ít hơn. Ví dụ, Servlets được khởi tạo bởi thùng chứa servlet, các bean trong Spring được khởi tạo với Spring, v.v.

Tuy nhiên, khi sử dụng lớp kiên trì, bạn sẽ khởi tạo các đối tượng tồn tại trước khi chúng được duy trì. Khi sử dụng Hibernate, ví dụ bạn sẽ gọi mới trên đối tượng đã tồn tại trước khi gọi lưu trên HibernateTemplate của bạn.

Các vấn đề liên quan