Кинжал 2. Два зависимых компонента не могут использовать одну и ту же область видимости. - PullRequest
0 голосов
/ 07 ноября 2018

В качестве вопроса упоминания знаю, что Dagger 2 по следующей ссылке

https://guides.codepath.com/android/dependency-injection-with-dagger-2#scopes

Два зависимых компонента не могут использовать одну и ту же область действия

Однако, причина, упомянутая в следующей ссылке, мне не ясна.

https://github.com/google/dagger/issues/107#issuecomment-71073298

Джек Уортон сказал, что ...

Два компонента с одинаковой областью действия могут нарушить область видимости.

Из вашего примера:

Component1 c1 = Dagger_Component1.create ();

Component2 c2_a = Dagger_Component2.builder (). Component1 (c1) .build ();

Component2 c2_b = Dagger_Component2.builder (). Component1 (c1) .build ();

c1 имеет синглтоны, которые используются через c2_a и c2_b, но синглтоны из Component2 получают отдельные экземпляры в c2_a и c2_b

Как это ломается ?? ##

c2_a изменит область действия c1 или что он сломает?

спасибо, ребята.

1 Ответ

0 голосов
/ 07 ноября 2018

Допустим, компонент 1 и компонент 2 имеют область действия, называемую @ AwesomeScope

Допустим, компонент 2 предоставляет банан для @ AwesomeScope

Когда создается c1, он создает потрясающую область видимости. Когда c2_a создается в зависимости от c1, он не создает потрясающую область, потому что c1 уже имеет потрясающую область. Вместо этого c2_a делится потрясающей областью, созданной c1.

Когда создается c2_b, он также разделяет потрясающую область, созданную c1 по той же причине, что и c2_a выше.

Исходя из вышесказанного, мы можем сделать вывод, что c2_b и c2_a используют одну и ту же потрясающую область видимости, созданную c1.

Когда c2_a пытается создать банан для потрясающей области, он перебирает зависимости, чтобы увидеть, что есть еще один банан в потрясающей области. c_2a видит только, что c1 имеет потрясающую область видимости. Поскольку в c1 нет банана, c_2a создает банан и сохраняет его в экземпляре c_2a, потому что c_2a определен как имеющий потрясающую область действия.

То же событие происходит при создании c2_b, потому что c2_b не имеет возможности достичь c2_a в той же потрясающей области видимости и проверить, есть ли у c2_a банан или нет. Теперь и c1_a, и c2_b имеют бананы, что означает, что в одной потрясающей области есть 2 банана. Поскольку в каждой потрясающей области должен существовать только один банан, мы можем заключить, что он нарушил область действия.

...