Функция расширения Kotlin с запросом на отдых сервера

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

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

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

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

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

restService.log(log)

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

1 ответ

Решение

В файле, где вы определяете функцию расширения, также определите "синглтон" 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,

Другие вопросы по тегам