簡體   English   中英

在不同范圍內提供相同類型的 Guice 提供程序 - 循環依賴

[英]Guice provider that provides the same type in different scopes - circular dependency

我想@RequestScope 一個 class(例如 Rabbit.class)。 一種簡單的方法是使用 @RequestScope 注釋 class,或者在模塊中添加語句

  public void configure(){
    bind(Rabbit.class).in(RequestScope.class)
    ...
  }

然而,這是一個有點危險的變化,所以我想用一個實驗標志來保護這種行為。 對於任何給定的請求,實驗標志可能不同(真或假)。 所以 RequestScope'ing 必須在注入標志的提供者中完成。

public class RabbitProvider extends Provider<Rabbit> {

    @Inject
    RabbitProvider(boolean flag, @ThisIsRequestScoped Rabbit requestScopedRabbit, @ThisIsNotRequestScoped Rabbit newRabbit) {
      // save to instance vars
    }

    @Override
    Rabbit get() {
      return flag ? requestScopedAnimal : newAnimal;
    }
}
  public void configure(){
    bind(Rabbit.class).annotatedWith(ThisIsRequestScoped.class).in(RequestScoped.class);
    bind(Rabbit.class).annotatedWith(ThisIsNotRequestScoped.class);
    bind(Rabbit.class).toProvider(RabbitProvider.class);
  }

不好。 循環依賴:

兔子 -> RabbitProvider -> @ThisIsRequestScoped 兔子 -> 兔子

@ThisIsNotRequestScoped Rabbit 和 @ThisIsRequestScoped Rabbit 兩個鍵都指向指向提供程序的 Rabbit。 不知道如何修復這個圈子。 有任何想法嗎? 甚至可以將一個類型綁定到一個提供者,該提供者將在不同的范圍內提供該類型?

啊 - 如果您有超類類型,找到一種可行的方法。

假設 Rabbit 擴展了 Animal,然后:讓所有應用程序代碼注入 Animal,將 Animal 綁定到提供者,並且您可以給 Rabbit 任何綁定,例如帶注釋的 @ThisIsRequestScoped 綁定。 在提供者中,由於 Rabbit 隱式綁定到自身,因此您可以注入它(將創建一個新實例,或者您可以注入 @ThisIsRequestScoped Rabbit 以獲取請求范圍的一個)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM