2012-01-23 21 views
70

Tôi đã đọc https://github.com/google/guice/wiki/AssistedInject nhưng không nói cách chuyển giá trị của đối số AssistedInject. Lệnh gọi injector.getInstance() sẽ như thế nào?Làm thế nào để sử dụng Guice's AssistedInject?

+0

liên quan, các câu trả lời dưới đây không bao gồm trường hợp ông cùng loại được sử dụng nhiều lần. https://stackoverflow.com/questions/23553865/using-assisted-inject-with-multiple-params-of-same-type-named-params – Alex

Trả lời

127

Kiểm tra javadoc của lớp FactoryModuleBuilder.

AssistedInject cho phép bạn định cấu hình động Factory cho lớp thay vì tự viết mã. Điều này thường hữu ích khi bạn có một đối tượng có một phụ thuộc cần được tiêm và một số tham số phải được chỉ định trong khi tạo đối tượng.

Ví dụ từ docummentaiton là một RealPayment

public class RealPayment implements Payment { 
    @Inject 
    public RealPayment(
     CreditService creditService, 
     AuthService authService, 
     @Assisted Date startDate, 
     @Assisted Money amount) { 
    ... 
    } 
} 

Thấy rằng CreditServiceAuthService nên được tiêm bằng container nhưng STARTDATE và số tiền phải được quy định bởi một nhà phát triển trong quá trình tạo ví dụ.

Vì vậy, thay vì tiêm một Payment bạn đang tiêm một PaymentFactory với các thông số được đánh dấu là @Assisted trong RealPayment

public interface PaymentFactory { 
    Payment create(Date startDate, Money amount); 
} 

Và một nhà máy nên được binded

install(new FactoryModuleBuilder() 
    .implement(Payment.class, RealPayment.class) 
    .build(PaymentFactory.class)); 

nhà máy cấu hình có thể được tiêm vào các lớp học của bạn.

@Inject 
PaymentFactory paymentFactory; 

và được sử dụng trong mã của bạn

Payment payment = paymentFactory.create(today, price); 
+6

Đã tìm kiếm rất nhiều và không thể tìm thấy giải thích ngắn gọn và rõ ràng hơn cho tôi nghi ngờ. Rất cám ơn – Gabber

+11

Điều này dễ hiểu hơn tài liệu trên Github. Làm tốt. – arjabbar

+5

Tài liệu Github là crap so với điều này. – EMM

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