在开发库时,我们应该在哪里存储根对象图?

时间:2017-12-07 16:03:55

标签: android dependency-injection

通常在开发Android应用程序时,将对象图(可能是匕首组件)存储在应用程序子类中。

val objectGraph = MySdk.Builder()
  .build

但是在SDK(android-library)的上下文中,我们无法访问应用程序子类。

此SDK将负责启动某些活动。这些活动需要访问对象图。如果不静态存储图形,怎么做呢?

1 个答案:

答案 0 :(得分:1)

不确定这是否真的是你想要的答案,而且#34;静态存储图表",但它可能会有所帮助。

对于我目前正在工作的图书馆(对于客户来说)。我们使用如下的类来保存对象图而不是自定义的Application类:

public final class MySdk {

    private static ObjectGraph objectGraph;

    public MySdk(String clientKey, Application application) {

        objectGraph = new ObjectGraph();
        objectGraph.buildGraph(clientKey, application);

    }

    public static Authentication getAuthentication(){
        return getObjectGraph().get(Authentication.class);
    }

    private static ObjectGraph getObjectGraph(){

        if (objectGraph == null) {
            throw new IllegalStateException("The constructor must be called first");
        }

        return objectGraph;
    }

}

希望使用该库的集成商需要构建该类(通常在他们自己的自定义应用程序类的onCreate中)

public class CustomApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        MySdk mySdk = new MySdk(BuildConfig.CLIENT_KEY, this);
    }
}

之后,依赖关系可以从任何地方获得,如下所示:

Authentication authentication = MySdk.getAuthentication();

(ObjectGraph当然是你想要的,Dagger组件或家庭成长。我们并不想将Dagger2放入库中,所以我们现在使用这样的东西:https://github.com/erdo/asaf-project/blob/master/example01databinding/src/main/java/foo/bar/example/asafdatabinding/ObjectGraph.java