如何在android库项目中使用dagger

时间:2014-11-09 21:11:50

标签: java android dagger

我正在尝试将Dagger添加到我的android项目中。对于应用程序项目,我很容易清楚,如何构建ObjectGraph。但我不知道在我的android库项目中最好的方法是什么。

我应该继续在应用程序的Application类中构建ObjectGraph并将OG传递给LibraryModule - 将库的OG插入到Apps OG中吗?或者我应该在库中构建整个ObjectGraph吗?

如果我需要ObjectGraph.inject(this)在库中注入一个类怎么办?在我的Apps项目中,我可以从Application类中获取OG。但是如何在图书馆处理这个?我应该为ObjectGraph添加@Provides方法吗?

非常感谢你的帮助。

编辑: 简而言之:如何在我无法访问OG的库项目中调用ObjectGraph.inject(this),因为它正在Application类中构建?

4 个答案:

答案 0 :(得分:29)

如果有人使用Dagger 2来到这里,这就是我在我的应用程序中完成的方式:

在库模块中,我创建了以下模块和组件:

@Module
public class ModuleUtil {

    @Provides
    public RestTemplate provideRestTemplate() {
        return new RestTemplate();
    }

}

@Singleton
@Component(
        modules = {
                ModuleUtil.class
        })
public interface MainComponent {
    void inject(Postman postman);
}

然后我在下面创建了Singleton以管理注射:

public class DaggerWrapper {

    private static MainComponent mComponent;

    public static MainComponent getComponent() {
        if (mComponent == null) {
            initComponent();
        }
        return mComponent;
    }

    private static void initComponent () {
       mComponent = DaggerMainComponent
                .builder()
                .utilModule(new ModuleUtil())
                .build();
    }
}

当库模块中的某个类需要注入其成员时,我只需调用DaggerWrapper.getComponent().inject(this);即可。

答案 1 :(得分:11)

我这样做:

  1. @Module类属于主项目,它们提供了注入库元素的实现,因此库项目中没有@Module类

  2. 期望依赖的库元素必须能够访问ObjectGraph并自己调用.inject(),但是主项目应该使用提供的@Module依赖项将ObjectGraph实例提供给库

  3. 如何将ObjectGraph从主项目导入库中?你可以有这样的界面:

    interface Injector {
        void inject(Object object);
        public ObjectGraph getObjectGraph(); 
    }
  4. Activity或Application类之类的Context对象实现了这个接口(ObjectGraph对象的持有者)。

    如果您在库模块中有Activity的示例,需要从主项目中注入一些东西,这将是这样的:

    class LibraryActivity extends Activity {
    
        @Inject ActivationModule instance;
    
        void onCreate(... ) {
            Injector injector = (Injector)getApplicationContext();
            injector.inject(this)
        }
    }
    

    ActivationModule是库项目中的类/接口。

    主项目有应用程序类,它实现了Injector接口并创建了ObjectGraph,并为库项目中的ActivationModule提供了依赖性。

    class MyApplicationInTheMainProject extends Application implements Injector {
    
        ObjectGraph graph;
    
        @Override
        public void onCreate() {
            super.onCreate();
            graph = ObjectGraph.create(new ActivationModuleImpl(this));
        }
    
        @Override public void inject(Object object) {
            graph.inject(object);
        }
    
        @Override public ObjectGraph getObjectGraph() {
            return graph;
        }
    }
    
    
    @Module(injects = {
            LibraryActivity.class
    }, library = true)
    class ActivationModuleImpl implements ActivationModule {
        ....
    }
    

答案 2 :(得分:4)

如果您将此库提供给人们并且他们对您的场景一无所知,那么您必须以您的Dagger完美工作的方式编写它,而无需用户的任何帮助。 (使用更好的练习更容易)

我刚为你写了一些图书馆来展示如何做到这一点。我以一种你甚至可以独立运行它的方式编写库,并在消息选项卡中查看结果。你的图书馆的用户不需要对匕首一无所知,也没有做任何他只是使用图书馆和匕首的配置:

https://github.com/amirziaratii/libraryUsingDagger.git

如果这个库是您自己使用的,也是您自己的项目,那么最好的做法是在我朋友的这个项目中这样做:

https://github.com/mmirhoseini/trakt.tv

这两个项目都回答了您的所有问题。在评论中提出任何疑问和错误答案。

答案 3 :(得分:-3)

以下是在应用程序中如何使用dagger的完整示例 步骤1将depedancy添加到项目级gradle     classpath'com.neenbedankt.gradle.plugins:android-apt:1.8' 第2步模块级别的延迟

申请插件:'com.android.application' apply plugin:'android-apt' 申请插件:'com.neenbedankt.android-apt'

compile 'com.google.dagger:dagger:2.0'
provided 'com.google.dagger:dagger-compiler:2.0'
provided 'org.glassfish:javax.annotation:10.0-b28'

步骤3使用您的应用程序类构建Dagger

公共类TubeMateApp扩展了Application {

public  AppComponent component;
public static TubeMateApp singleton;


public static TubeMateApp getInstance() {
    return singleton;
}

@Override
public void onCreate() {
    super.onCreate();
    singleton = this;
    setupGraph();
}

private void setupGraph() {
    component = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();

    component.inject(this);
}


public AppComponent component() {
    return component;
}

} 步骤4像这样创建AppModule

@Module 公共类AppModule {

private TubeMateApp app;

public AppModule(TubeMateApp application) {
    this.app = application;
}



@Provides
public Application provideApplication() {
    return app;
}

@Provides
@Singleton
Prefs prefs(){
    return Prefs.with(app);
}

// To use your custom requirement code here for example i have used Picasso with in the application

@Provides
@Singleton
Picasso getPicasso(){
    return Picasso.with(app);
}

@Provides
@Singleton
LayoutInflater getLayoutInflater() {
    return (LayoutInflater) app.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

} 步骤5创建需要注入的应用程序组件 dagger App Components here 步骤6在主要飞溅活动中使用匕首 how to apply dagger inject see this screenshot