我正在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注入几个将使用它的Activity中?
我是用
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中都必须这样做?我一定做错了什么。
任何帮助都会很棒。谢谢!
最佳答案
如果您将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应该做剩下的。