จะดึงอินสแตนซ์ที่มีคำอธิบายประกอบจากหัวฉีดของ Guice ได้อย่างไร


89

สมมติว่าฉันมีโมดูล:

Module extends AbstractModule
{
  @Override
  protected void configure()
  {
    bind(String.class).
      annotatedWith(Names.named("annotation")).
        toInstance("DELIRIOUS");
  }
}

และฉันต้องการทดสอบโมดูลและตรวจสอบว่ามันฉีดค่าที่ถูกต้องในStringฟิลด์ที่มีคำอธิบายประกอบNames.named("annotation")โดยไม่ต้องมีคลาสและฟิลด์ แต่ได้รับค่าโดยตรงจากหัวฉีด:

@Test
public void test()
{
  Injector injector = Guice.createInjector(new Module());

  // THIS IS NOT GOING TO WORK!
  String delirious = injector.getInstance(String.class); 

  assertThat(delirious, IsEqual.equalTo("DELIRIOUS");
}

คำตอบ:



15

ฉันใช้วิธีต่อไปนี้

public <T> T getInstance(Class<T> type, Class<? extends Annotation> option) {
    final Key<T> key = Key.get(type, option);
    return injector.getInstance(key);
}

สำหรับสิ่งนี้. โดยทั่วไปคุณยังคงมีปัญหาในการสร้างอินสแตนซ์คำอธิบายประกอบ แต่วิธีนี้ใช้Names.named("annotation")งานได้


4
ฉันคิดว่ามันเป็นการดีที่กล่าวถึงว่าโซลูชันดั้งเดิมมีไว้สำหรับข้อกำหนดเฉพาะที่ระบุชื่อ หากคุณมี Annotation (Interface @Annotation เฉพาะ) ที่คุณสร้างขึ้นคุณก็แค่ทำการโทรเป็น getMethod เฉพาะ: injector.getInstance (Key.get (DesiredObject.class, Annotation.class));
BoneSmuggler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.