Вам не нужно создавать свой компонент для каждого класса, в который вы хотите внедрить зависимости. Зависимости могут быть предоставлены через конструктор, помеченный @Inject
:
public class PersonsRemoteRepository implements PersonsRepository {
private RestClient restClient;
@Inject
public PersonsRemoteRepository(RestClient restClient) {
this.restClient = restClient;
}
}
И любой другой класс, которому нужен этот репозиторий, может сделать то же самое:
public class AnyOtherClass {
private PersonsRemoteRepository personsRemoteRepository;
@Inject
public AnyOtherClass(PersonsRemoteRepository personsRemoteRepository) {
this.personsRemoteRepository = personsRemoteRepository;
}
Вам нужно только использовать [ 116] для классов, экземпляры которых создаются Android, таких как Приложение, Действия и Фрагменты.
public class MyActivity {
@Inject PersonsRemoteRepository personsRemoteRepository;
@Override
public void onCreate() {
super.onCreate();
CoreApplication.getComponent().inject(this);
}
}
Изменения, необходимые в вашем CoreApplication:
public class CoreApplication extends MultiDexApplication {
private static ProjectApplicationComponent component;
@Inject private RestClient restClient;
@Inject private Picasso picasso;
@Inject private Handler handler;
@Override
public void onCreate() {
super.onCreate();
...
component = DaggerProjectApplicationComponent.builder()
.contextModule(new ContextModule(this))
.networkServiceModule(new NetworkServiceModule(ClientSettings.SERVER_URL))
.build();
component.inject(this);
}
}
Изменения, необходимые в вашем ApplicationComponent:
@ActivitiesScope
@Component(dependencies = ProjectApplicationComponent.class)
public interface ApplicationComponent {
void inject(CoreApplication coreApplication);
void inject(MyActivity myActivity);
}
В CPython, по крайней мере, закрываются файлы, когда объект файла освобожден. Посмотрите file_dealloc
функция в Objects/fileobject.c
в источнике CPython. Методы Dealloc являются видом - подобных __del__
для типов C, кроме без некоторых проблем, свойственных к __del__
.
Следовательно с оператором.
Для Python 2.5 использовать
from __future__ import with_statement
(Для Python 2.6 или 3.x ничего не сделайте),
with open( "someFile", "rU" ) as aFile:
# process the file
pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.
Python использует подсчет ссылок и детерминированное разрушение в дополнение к сборке "мусора". Когда больше нет ссылок на объект, объект сразу выпущен. Выпуск файла закрывает его.
Это отличается, чем, например, Java, где существует только недетерминированная сборка "мусора". Это означает, что Вы означаете, знают, когда объект выпущен, таким образом, необходимо будет закрыть файл вручную.
Обратите внимание, что подсчет ссылок не прекрасен. У Вас могут быть объекты с циклическими ссылками, который не достижим от проножки. Вот почему Python имеет сборку "мусора" в дополнение к подсчету ссылок.
Лучшее предположение - то, что, потому что типом файла является встроенный тип, сам интерпретатор обрабатывает закрытие файла на сборке "мусора".
С другой стороны, Вы только проверяете после того, как интерпретатор Python вышел, и все "пропущенные" дескрипторы файлов закрываются так или иначе.