我在Android上使用Guice 3.0来做一些DI。
我有
public interface APIClient { }
和
public class DefaultAPIClient implements APIClient { }
我所做的是尝试在我的MyApplication类中引导Guice,为它提供一个在configure方法bind(APIClient.class).to(DefaultAPIClient.class);
中有一个语句的模块
我做了Guice的例子告诉我做的事情
Injector injector = Guice.createInjector(new APIClientModule());
injector.getInstance(APIClient.class);
我可能没有正确理解这一点,但是我如何将APIClient注入到将要使用它的几个活动中呢?
我在HomeActivity
public class HomeActivity extends RoboActivity {
@Inject APIClient client;
protected void onCreate(Bundle savedInstanceState) {
client.doSomething();
}
}
这不起作用,它给了我Guice configuration errors: 1) No implementation for com.mycompany.APIClient was bound
所以我能够让这个工作的唯一方法是从HomeActivity中的APIClient客户端删除@Inject
并使用client = Guice.createInjector(new APIClientModule()).getInstance(APIClient.class);
这是否意味着我必须在每个使用APIClient的Activity中执行此操作?我一定是做错了。
任何帮助都会很棒。谢谢!
答案 0 :(得分:4)
如果您使用Roboguice 2.0和Guice 3.0_noaop,定义其他自定义模块的方法是通过字符串数组资源文件roboguice_modules:
来自文档(Upgradingto20):
由于该类已经消失,因此不再需要/可能继承RoboApplication。如果要覆盖默认的RoboGuice绑定,可以在res / values / roboguice.xml中名为“roboguice_modules”的字符串数组资源中指定自定义模块类名。例如
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="roboguice_modules">
<item>PACKAGE.APIClientModule</item>
</string-array>
</resources>
因此,您需要按如下方式定义自定义模块:
roboguice_modules:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="roboguice_modules">
<item>DONT_KNOW_YOUR_PACKAGE.APIClientModule</item>
</string-array>
</resources>
当然,APIClient和DefaultAPIClient之间存在绑定。
和Roboguice应该做其余的事。
答案 1 :(得分:4)
非常感谢Groupon的Michael Burton在Roboguice mailing list上回答这个问题。对于任何感兴趣的人,以下是如何以编程方式执行此操作。
public class MyApplication extends Application {
@Override
public void onCreate() {
RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(this)).with(new MyCustomModule()));
}
}
现在我可以在Activity中正确地注入@Inject private APIClient client
。
答案 2 :(得分:-1)
您应该使用Guice 2.0(no aop)代替Guice 3.0
要正确配置Guice,您需要在应用程序类中覆盖addApplicationModules(List<Module> modules)
方法并在那里添加模块。
public class MyApplication extends RoboApplication {
@Override
protected void addApplicationModules(List<Module> modules) {
modules.add(new YourModule());
}
要在您的活动中使用注射,您需要致电super.onCreate(savedInstanceState)
因为成员是用RoboActivity的onCreate
方法注入的。
public class HomeActivity extends RoboActivity {
@Inject APIClient client;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Call this before use injected members
client.doSomething();
}
}