Я настраиваю функцию расширения для Timber. Я хочу иметь функцию отправки журнала на мой сервер.
Проблема для меня - Кинжал. У меня есть экземпляр класса RestService в кинжале, и я использую его во всем приложении. Но чтобы его использовать, мне нужно где-то залить этот RestService. Я не могу сделать это в конструкторе, потому что у меня его нет.
Я хочу иметь что-то вроде этого:
fun Timber.serverLogDebug(log: String) {
restService.log(log)
}
Возможно ли это вообще? Для меня будет удобно использовать мой механизм, например, простой Timber.d(). Или я могу позвонить
restService.log(log)
в каждом месте. Но я должен иметь этот экземпляр везде.
В файле, где вы определяете функцию расширения, а также определить "одиночки" 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 DebugTree
.
Примечание. Если вы хотите регистрироваться на сервере каждый раз, когда вы входите в систему (или каждый раз, когда вы регистрируете событие определенного уровня), вам лучше создать собственный Timber.Tree
.