gpt4 book ai didi

dependencies - 如何与在 Guice 中使用注释值的提供者绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 05:12:49 25 4
gpt4 key购买 nike

有没有办法与提供者绑定(bind),该提供者在 Google Guice 中解释目标的注释值?

例子:

bind(Resource.class)
.annotatedWith(MyAnnotation.class)
.toProvider(new MyProvider<MyAnnotation, Resource>{
public Resource get(MyAnnotation anno){
return resolveResourceByAnnoValue(anno.value());
}
});

我想通过带注释的绑定(bind)来初始化 Android Activity 类的字段。
它应该必须通过它的唯一 ID 来获取多个资源。

原始方式:
public class TestActivity extends Activity{
private TextView textView;
private Button testButton;

public void onAfterCreate(...){
// set UI declaration resource.
setContentView(R.layout.activity_test);

// initialize fields, it must be done after setting ui definition.
textView = (TextView) findViewById(R.id.textView);

.... initialize other fields, hook them...

...
}

我想以声明的方式绑定(bind) UI 和它的字段,而不是务实地喜欢上面:
@ResourceID(R.layout.activity_test)
public class TestActivity extends InjectiveActivity{
@ResourceID(R.id.textView) // Auto generated static resource id constant
private TextView textView;

@ResourceID(R.id.testButton)
private Button testButton;

...
}

最佳答案

这是不可能的。

如果 @MyAnnotation是一个绑定(bind)注解,它将使用它的 equals 进行比较方法。 @MyAnnotation(5) Resource将绑定(bind)到 @MyAnnotation(5) Resource , 与 @MyAnnotation(6) Resource 相比根本不匹配.查看 this SO answer更多。与该答案一样,如果您愿意,您可以遍历可能的注释值并单独绑定(bind)每个注释值。

如果 @MyAnnotation不是绑定(bind)注释,您将无法从您的提供者那里访问它。如 this SO answer 中所述, 是 a rejected feature将注入(inject)站点信息添加到提供程序或依赖项本身。

您最好的选择是创建一个 @Assisted injection (或手动工厂)接受参数:

class MyConsumer {
final Resource resource;
@Inject MyConsumer(Resource.Factory resourceFactory) {
int previouslyAnnotatedValue = 5;
this.resource = resourceFactory.createWithValue(previouslyAnnotatedValue);
}
}

您也可以考虑使用 Custom Injections ,这将允许您使用 @Inject 以外的任意注释,它可以根据需要使用运行时注释值。

关于dependencies - 如何与在 Guice 中使用注释值的提供者绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com