Làm thế nào để sử dụng Guice's AssistedInject?


84

Tôi đã đọc https://github.com/google/guice/wiki/AssistedInject , nhưng nó không cho biết cách chuyển các giá trị của đối số AssistedInject. Lệnh gọi injectionor.getInstance () trông như thế nào?


liên quan, các câu trả lời dưới đây không bao gồm các trường hợp cùng loại được sử dụng nhiều lần. stackoverflow.com/questions/23553865/…
Alex

Câu trả lời:


168

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

AssistedInjectcho phép bạn cấu hình động Factorycho lớp thay vì tự mã hóa nó. Điều này thường hữu ích khi bạn có một đối tượng có các phụ thuộc cần được đưa vào và một số tham số phải được chỉ định trong quá trình tạo đối tượng.

Ví dụ từ tài liệu là một RealPayment

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

Hãy xem điều đó CreditServiceAuthServicenên được đưa vào bởi vùng chứa nhưng ngày bắt đầu và số lượng phải được chỉ định bởi nhà phát triển trong quá trình tạo phiên bản.

Vì vậy, thay vì tiêm một, Paymentbạn đang tiêm một PaymentFactoryvới các thông số được đánh dấu là @AssistedtrongRealPayment

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

Và một nhà máy nên được ràng buộc

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

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

@Inject
PaymentFactory paymentFactory;

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

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

8
Tìm hiểu rất nhiều và không thể tìm thấy một lời giải thích ngắn gọn và rõ ràng hơn cho những nghi ngờ của tôi. Cảm ơn nhiều
Gabber

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

8
Tài liệu Github là tào lao khi so sánh với tài liệu này.
EMM

2
Không nên chuyển 'ngày tháng' và 'số tiền' trong lệnh gọi phương thức thành 'Thanh toán'? Tại sao chúng phải được đưa vào đây trong hàm tạo?
Harshit

2
Đối với những người tự hỏi, RealPaymentkhông cần phải thực hiện một giao diện.
jsallaberry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.