Skip to content
Roman edited this page Jul 16, 2018 · 12 revisions

Недавно перевёл проект на Toothpick. Решил частично перевести документацию и сделать основные заметки что к чему.

toothpick/wiki

Scopes

Scope - это одна из основных концепций в Toothpick. На самом деле это важно для всего DI в целом, но Toothpick явно выделяет его для разработчиков.

Scopes, создание инстенсов и инъекции

В Toothpick инъекции и создание инстенсов всегда выполняется в рамках скоупа.

Ниъекции в рамках скоупа

Рассмотрим следующий пример

//a class using field and method injections
class Foo {
  @Inject Bar bar;
  @Inject void setQurtz(Qurtz qurtz) {...}
}

//injecting an object in a scope
Toothpick.inject(new Foo(), scope);

======================

Получить текущий скоуп

Можно заинжектить в класс сам скоуп. Это удобно когда например Presenter хочет сам закрыть скоуп в onDestroy() на не знает где взять его имя

class MyPresenter @Inject constructor( private val foo : Foo) {
  @Inject scope: Scope;
   
  override fun onDestroy() {
        super.onDestroy()
        Toothpick.closeScope(scope.name)
  }
}

instancesInScope()

bind(IFoo.class).to(Foo.class).instancesInScope()

смысл instancesInScope() в том, что Экземпляр Foo создасться только в одном скоупе. Если у нас есть два скоупа, S1 и S2 (S1 родитель для S2) и в скоупе S1 уже был создан экземлпяр Foo, то Toothpick.inject(new A(), S2) приведёт к тому, что a.foo будет тем же экземпляром что и в скоупе S1. Вобщем это

Clone this wiki locally