Внедрение зависимостей с приоритетной очередью заданий в чистой архитектуре
Я использую приоритетную очередь работ в проекте, который использует концепции чистой архитектуры. Дело в том, что для создания DI с приоритетной очередью заданий мне нужно создать задание BaseJob следующим образом:
abstract public class BaseJob extends Job {
@Retention(RetentionPolicy.SOURCE)
@IntDef({UI_HIGH, BACKGROUND})
public @interface Priority {
}
public static final int UI_HIGH = 10;
public static final int BACKGROUND = 1;
public BaseJob(Params params) {
super(params);
}
protected boolean shouldRetry(Throwable throwable) {
return true;
}
public void inject(ApplicationComponent appComponent) {
}
Проблема в том, что в строках:
public void inject(ApplicationComponent appComponent) {
}
Мне нужно получить доступ к ApplicationComponent, который находится на уровне презентации, но поскольку мой BaseJob находится на уровне данных, у меня нет к нему доступа.
Если я сделаю слой данных осведомленным о представлении, я нарушу принципы чистой архитектуры.
У кого-нибудь есть идеи, как я мог это сделать?
1 ответ
В чистой архитектуре дяди Боба нет уровня данных, кроме сущностей, вариантов использования, интерфейсных адаптеров и структур. Внутренние круги не должны знать о внешних кругах. Вы можете инвертировать зависимости, определив интерфейс во внутреннем круге и внедрив его во внешний круг.
Поэтому, вероятно, вам потребуется интерфейс для определения вашего ApplicationComponent во внутреннем круге.
Для более подробного обсуждения инверсии зависимостей посмотрите мой пост https://plainionist.github.io/Implementing-Clean-Architecture-Controller-Presenter/