我来自C#/ .NET的后台并且已经学会了使用一些Android.Now我开始构建一个小应用程序以获得乐趣,我想学习一个IoC框架。经过一些googeling我找到了roboguice。但我无法弄清楚如何整合它。等。
NET我曾与Ninject和Unity合作,我希望创建一种类似的构造函数注入形式,我从这些框架中获取。
这是我到目前为止所拥有的以及我认为我已经想到的内容:
这个类代表app bootstrapper,这里我将注册我的依赖配置类:
public class IOCApplication extends Application{
@Override
public void onCreate(){
super.onCreate();
RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), new IOCModule());
}
}
这是Dependency配置类:
public class IOCModule implements Module{
@Override
public void configure(com.google.inject.Binder binder) {
binder.bind(ITest.class).to(Test.class);
}
}
在我的AndroidManifest中,我添加了这个:
<application ... android:name="com.example.project2.IOCApplication">
这一部分我并未真正理解为什么我必须添加,但我认为有必要告诉Android IOCApplication应首先进行实例化。
这是我的MainActivily类的clas,我为它添加了一个构造函数:
public ITest test;
public MainActivity(ITest test){
this.test = test;
}
当我尝试在我的Android设备上运行时,看起来应用程序正在进入无限循环,我认为ITest不会被实例化。
我做错了什么?
答案 0 :(得分:1)
使用Android可以了解的一点是您没有实例化自己的活动,它就是系统。
因此,您无法对活动使用构造函数注入。 但是,您可以使用属性注入,这是更清洁的IMO。
扩展RoboActivity
类是使用Activity
注入的最简单方法。
RoboGuice为其他Android组件提供了类似的类(RoboFragment
,RoboService
等。)
public class MyActivity extends RoboActivity {
@Inject
ITest test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// You can now use your test instance
}
}
调用@Inject
后,将super.onCreate(savedInstanceState);
的所有属性都会被实例化。
使用 POJO (普通旧Java对象),您有更多选择:
属性注入
public class Test {
@Inject
private Service1 service1;
@Inject
private Service2 service2;
public Test() {
}
}
构造函数注入
public class Test {
private Service1 service1;
private Service2 service2;
@Inject
public Test(Service1 service1, Service2 service2) {
this.service1 = service1;
this.service2 = service2;
}
}
请注意,如果构造函数具有参数,则必须具有@Inject
注释。
您需要此行<application ... android:name="com.example.project2.IOCApplication">
告诉系统您正在使用扩展的Application
类。没有它,Android将使用基类。
我建议您阅读official documentation以获取更多信息。