Функция расширения Kotlin с запросом на отдых сервера - PullRequest
0 голосов
/ 08 января 2019

Я настраиваю функцию расширения для Timber. Я хочу иметь функцию отправки журнала на мой сервер.

Проблема для меня - Кинжал. У меня есть экземпляр класса RestService в кинжале, и я использую его во всем приложении. Но чтобы его использовать, мне нужно где-то залить этот RestService. Я не могу сделать это в конструкторе, потому что у меня его нет.

Я хочу что-то вроде этого:

fun Timber.serverLogDebug(log: String) {
    restService.log(log)
}

Возможно ли это вообще? Для меня будет удобно использовать мой механизм, например, простой Timber.d (). Или я могу позвонить

restService.log(log)

в каждом месте. Но я должен иметь этот экземпляр везде.

1 Ответ

0 голосов
/ 08 января 2019

В файле, где вы определяете функцию расширения, также определите «singleton» object для хранения вашего экземпляра restService, создайте для него установщик и сослаться на него из функции регистратора.

private object ServiceHolder {
    var restService: RestService
}

fun Timber.setRestService(restService: RestService) {
    ServiceHolder.restService = restService
}

fun Timber.serverLogDebug(log: String) {
    ServiceHolder.restService.log(log)
}

Теперь вы можете «статически внедрить» свой экземпляр службы, позвонив по номеру Timber.setRestService, где вы сажаете древесину DebugTree.

Примечание. Если вы хотите регистрироваться на сервере каждый раз, когда вы регистрируетесь (или каждый раз, когда вы регистрируете событие определенного уровня), вам лучше создать пользовательский Timber.Tree.

...