Guice 使用不同的提供者实例化不同的 类
Guice instantiate different classes with different providers
我有两个活动
public class GetActivity
{
ChildClass childclass;
@Inject
public GetActivity(ChildClass childClass)
{
this.childClass = childclass;
}
String id = childClass.get(id);
....
}
public class SaveActivity
{
ChildClass childclass;
@Inject
public SaveActivity(ChildClass childClass)
{
this.childClass = childclass;
}
childClass.save(id);
....
}
ChildClass 是具有以下方法的接口
public interface ChildClass
{
String get(id);
void save(id);
}
其实现如下
public class ChildClassImpl implements ChildClass
{
String storage;
public ChildClassImpl(String storage)
{
this.storage =storage;
}
String get(Id)
{
someOtherObject.get(id, storage);
}
void save(id)
{
someOtherObject.save(id, storage);
}
}
我编写了提供程序,它将 return ChildClass 方法
public class ChildClassProvider1 implements Provider<ChildClass>
{
@Override
public ChildClass get()
{
ChildClass childClass = new ChildClass("hello");
}
}
public class ChildClassProvider2 implements Provider<ChildClass>
{
@Override
public ChildClass get()
{
ChildClass childClass = new ChildClass("secondHello");
}
}
我想确保 GetActivity 和 SaveActivity 是使用提供程序 ChildClassProvider1 初始化的,但另一个 类 应该使用 ChildClassProvider2。如何使用 guice 实现这一点?
几个选项,具体取决于您希望将此要求融入代码的难易程度。
首先,通过模块中的提供方法:
class YourModule extends AbstractModule {
@Override protected void configure() {
bind(ChildClass.class).toProvider(ChildClassProvider1.class);
}
@Provides SaveAction saveAction(ChildClassProvider2 provider) {
return new SaveAction(provider.get());
}
}
其次,通过绑定注解
或者,提供绑定注解:
@BindingAnnotation @Retention(RUNTIME)
@interface YourAnnotation {}
然后:
// Ctor of SaveActivity.
@Inject
public SaveActivity(@YourAnnotation ChildClass childClass) { ... }
// In your module:
bind(ChildClass.class).annotatedWith(YourAnnotation.class)
.toProvider(ChildClassProvider2.class);
第二个选项是"baking it in harder",因为你必须在代码中放置绑定注解;但它不那么脆弱(从某种意义上说,您不必显式调用构造函数),并且感觉 "more guice-y".
如果您希望能够在某些情况下进行不同的配置,第一个选项是保持宽松一些。
我有两个活动
public class GetActivity
{
ChildClass childclass;
@Inject
public GetActivity(ChildClass childClass)
{
this.childClass = childclass;
}
String id = childClass.get(id);
....
}
public class SaveActivity
{
ChildClass childclass;
@Inject
public SaveActivity(ChildClass childClass)
{
this.childClass = childclass;
}
childClass.save(id);
....
}
ChildClass 是具有以下方法的接口
public interface ChildClass
{
String get(id);
void save(id);
}
其实现如下
public class ChildClassImpl implements ChildClass
{
String storage;
public ChildClassImpl(String storage)
{
this.storage =storage;
}
String get(Id)
{
someOtherObject.get(id, storage);
}
void save(id)
{
someOtherObject.save(id, storage);
}
}
我编写了提供程序,它将 return ChildClass 方法
public class ChildClassProvider1 implements Provider<ChildClass>
{
@Override
public ChildClass get()
{
ChildClass childClass = new ChildClass("hello");
}
}
public class ChildClassProvider2 implements Provider<ChildClass>
{
@Override
public ChildClass get()
{
ChildClass childClass = new ChildClass("secondHello");
}
}
我想确保 GetActivity 和 SaveActivity 是使用提供程序 ChildClassProvider1 初始化的,但另一个 类 应该使用 ChildClassProvider2。如何使用 guice 实现这一点?
几个选项,具体取决于您希望将此要求融入代码的难易程度。
首先,通过模块中的提供方法:
class YourModule extends AbstractModule {
@Override protected void configure() {
bind(ChildClass.class).toProvider(ChildClassProvider1.class);
}
@Provides SaveAction saveAction(ChildClassProvider2 provider) {
return new SaveAction(provider.get());
}
}
其次,通过绑定注解 或者,提供绑定注解:
@BindingAnnotation @Retention(RUNTIME)
@interface YourAnnotation {}
然后:
// Ctor of SaveActivity.
@Inject
public SaveActivity(@YourAnnotation ChildClass childClass) { ... }
// In your module:
bind(ChildClass.class).annotatedWith(YourAnnotation.class)
.toProvider(ChildClassProvider2.class);
第二个选项是"baking it in harder",因为你必须在代码中放置绑定注解;但它不那么脆弱(从某种意义上说,您不必显式调用构造函数),并且感觉 "more guice-y".
如果您希望能够在某些情况下进行不同的配置,第一个选项是保持宽松一些。