[英]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.