วิธีใช้ AssistedInject ของ Guice


85

ฉันได้อ่านhttps://github.com/google/guice/wiki/AssistedInjectแต่ไม่ได้บอกว่าจะส่งผ่านค่าอาร์กิวเมนต์ AssistedInject อย่างไร การเรียก injector.getInstance () จะมีลักษณะอย่างไร


ที่เกี่ยวข้องคำตอบด้านล่างไม่ครอบคลุมกรณีที่เขาใช้ประเภทเดียวกันหลายครั้ง stackoverflow.com/questions/23553865/…
Alexander Oh

คำตอบ:


171

ตรวจสอบ javadoc ของคลาสFactoryModuleBuilder

AssistedInjectช่วยให้คุณกำหนดค่าFactoryคลาสแบบไดนามิกแทนที่จะเข้ารหัสด้วยตัวเอง สิ่งนี้มักมีประโยชน์เมื่อคุณมีวัตถุที่มีการอ้างอิงที่ควรฉีดและพารามิเตอร์บางอย่างที่ต้องระบุในระหว่างการสร้างวัตถุ

ตัวอย่างจากเอกสารคือไฟล์ RealPayment

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

ดูนั่นCreditServiceและAuthServiceควรได้รับการฉีดโดยภาชนะ แต่ StartDate และจำนวนเงินควรมีการระบุโดยนักพัฒนาในระหว่างการสร้างอินสแตนซ์

ดังนั้นแทนที่จะฉีดPaymentคุณจะฉีดPaymentFactoryพารามิเตอร์ที่มีเครื่องหมาย@Assistedอยู่RealPayment

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

และควรผูกโรงงาน

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

สามารถฉีดโรงงานที่กำหนดค่าในชั้นเรียนของคุณได้

@Inject
PaymentFactory paymentFactory;

และใช้ในรหัสของคุณ

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

8
ค้นหามากและไม่สามารถหาคำอธิบายที่กระชับและชัดเจนสำหรับข้อสงสัยของฉันได้ ขอบคุณมาก
Gabber

18
เข้าใจง่ายกว่าเอกสารใน Github ทำได้ดี.
arjabbar

8
เอกสาร Github นั้นแย่มากเมื่อเทียบกับสิ่งนี้
EMM

2
ไม่ควรส่ง 'วันที่' และ 'จำนวนเงิน' ในวิธีการเรียกไปที่ 'การชำระเงิน'? ทำไมจึงควรฉีดที่นี่ในคอนสตรัคเตอร์?
Harshit

2
สำหรับผู้ที่สงสัยRealPaymentไม่จำเป็นต้องใช้อินเทอร์เฟซ
jsallaberry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.