Где мы должны хранить граф корневого объекта при разработке библиотеки?

109
14

Обычно при разработке приложения Android вы сохраняете свой граф объектов (возможно, компонент кинжала) в подклассе приложения.

val objectGraph = MySdk.Builder()
.build

Но в контексте SDK (android-library) у нас нет доступа к подклассу приложения.

Этот SDK будет отвечать за запуск определенных видов деятельности. Этим действиям потребуется доступ к графу объектов. Как это можно сделать, не сохраняя граф статистически?

спросил(а) 2017-12-07T19:03:00+03:00 2 года, 10 месяцев назад
1
Решение
58

Не уверен, что это действительно тот ответ, который вам нужен, поскольку он "хранит график статически", но это может помочь тем не менее.

Для библиотеки, над которой я сейчас работаю (для клиента). Мы используем класс, такой как следующий, чтобы удерживать граф объектов вместо пользовательского класса 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)

ответил(а) 2017-12-14T14:30:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема