0

嗨,我来自 C#/.NET 的背景,并且已经学会了使用一点 Android。现在我想开始构建一个有趣的小应用程序,并且我要学习 IoC 框架。经过一番谷歌搜索后,我发现了 roboguice .但是我不知道如何整合它.On .

NET 我曾与 Ninject 和 Unity 合作过,并希望创建一种类似形式的构造函数注入,就像我从这些框架中获得的那样。

这是我到目前为止所拥有的以及我认为我已经弄清楚的:

这个类代表应用程序引导程序,在这里我将注册我的依赖配置类:

public class IOCApplication extends Application{

@Override
public void onCreate(){
    super.onCreate();
    RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), new IOCModule());
}

}

这是依赖配置类:

 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 类,我为它添加了一个构造函数:

public ITest test;
public MainActivity(ITest test){
    this.test = test;
}

当我尝试在我的 android 设备上运行它时,它看起来像是应用程序进入了一个无限循环,我认为 ITest 没有被实例化。

我究竟做错了什么?

4

1 回答 1

1

Android 要知道的一件事是您不会实例化自己的活动,而是由系统来实例化。

因此,您不能将构造函数注入与活动一起使用。但是,您可以使用更清洁的 IMO 属性注入。

扩展RoboActivity类是使用注入的最简单方法Activity。RoboGuice 为其他 Android 组件( 、 等)提供了类似RoboFragmentRoboService

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 将使用基类。

我鼓励您阅读官方文档以获取更多信息。

于 2013-08-30T21:02:53.613 回答