Внедрение зависимостей с приоритетной очередью заданий в чистой архитектуре

Я использую приоритетную очередь работ в проекте, который использует концепции чистой архитектуры. Дело в том, что для создания 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/

Другие вопросы по тегам