Функция расширения 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
,