在类Util中注入对象资源(使用Dagger)

时间:2014-07-16 14:57:43

标签: android dependency-injection roboguice dagger

我有一些时间用Dagger测试一些东西,在监督了这里的一系列文章之后:http://antonioleiva.com/dependency-injection-android-dagger-part-1/,回过头来获取更多信息,我看到了一些很好的例子:https://github.com/adennie/fb-android-dagger,其中大部分都集中在关于注入ActivityFragmentService和相关的依赖关系。我想和RoboGuice做类似的事情。

在RoboGuice中

public class Utils {

    @InjectResource(R.string.hello_world) private String hello;

    public void showLog(){
        System.out.println("String from injected resource : " + hello);
    }
}

在Dagger

public class Utils {

    @Inject
    Resources mResource;

    public void showLog() {
        System.out.println( "String from injected resource : "  + this.mResource.getString( R.string.hello_world ) );
    }
}

我在我的应用程序中创建了一个模块:

@Module( injects = {Utils.class }, complete = false, library = true )
public class ResourceModule {

    Context mContext;

    public ResourceModule ( final Context mContext ) {
        this.mContext = mContext;
    }

    @Provides
    @Singleton
    Resources provideResources() {
        return this.mContext.getResources();
    }
}

在我的活动中试过这个

Utils mUtils = new Utils();
mUtils.showLog();

但我得到了NullPointerException。有人已经做过类似的事吗?

1 个答案:

答案 0 :(得分:2)

您必须使用inject方法注入对象。

假设您ObjectGraph类中的App已初始化,Application类是inject的子类,并公开了公共public void inject(Object object) { mObjectGraph.inject(object); } 方法,其实现如下:

Utils

创建Utils mUtils = new Utils(); ((App) getApplication).inject(mUtils); mUtils.showLog(); 实例后,必须注入其依赖项。

ObjectGraph

修改

您还可以使用构造函数注入(无需将对象传递给public class Utils { private final Resources mResource; @Inject public Utils(Resources resources) { mResources = resources; } public void showLog() { System.out.println( "String from injected resource : " + this.mResource.getString( R.string.hello_world ) ); } }

ObjectGraph

使用构造函数注入时,必须由Utils mUtils = mObjectGraph.get(Utils.class);

创建对象
{{1}}