在哪里放置所需数据的附加(将在 API 上传递)全局?

Where to put appending of required data (to be passed on API) globally?

清洁架构问题

我有很多表单 activities,其中有 1 个公共数据必须在提交期间附加,我的问题是,逻辑必须放在哪里?

域层还是表示层?

For Presentation:

我将创建一个 BaseFormActivity,它具有在 form 上插入所需数据的方法,该 formBaseForm 的子级,其中包含全局所需的数据。

BaseForm:(由所有形式扩展)

public class BaseForm {
   private String globalData;
   //getter setters...
}

BaseFormPresenter:

public class BaseFormPresenter extends BaseFormMvpView {
   private final GetGlobalDataInteractor mGetData; //to be injected, this is a use case

   public void getGlobalData() {
      mGetData.execute()
         .subscribe(data -> {
             getMvpView().showGlobalData(data);
          }); //just for the sake of simplicity
   }
}

BaseFormActivity:(由所有处理表单的 activity 扩展)

public abstract class BaseFormActivity implements BaseFormMvpView {
   @Inject
   BaseFormPresenter mPresenter;

   //onCreate(), etc
}

SpecificFormActivity:(扩展 BaseFormActivity)

public class SpecificFormActivity extends BaseFormActivity {

    private SpecificForm mForm; //extends BaseForm

    //onCreate(), etc

    @Override
    public void showGlobalData(String data) {
       mForm.setGlobalData(data);
    }

    //then ill just call the presenter to get the global data before submitting
}

For Domain:

SubmitSpecificFormInteractor:(抱歉编码,这只是我想做的事情的表示)

public class SubmitSpecificFormInteractor extends SingleUseCase<Return, Param> {

    //to be injected
    GlobalRepository mGlobalRepository; 
    SpecificFormRepository mFormRepository;

    //some initialization

    public Single<SomeResponse> buildObservable(@NonNull String specificFormData, String anotherSpecificFormData) {
       return mGlobalRepository.getGlobalData()
          .map(globalData -> SpecificFormDto.create(
                specificFormData, anotherSpecificFormData, globalData)) //create the dto then append global data
          .flatMap(specificFormDto -> mFormRepository.submit(specificFormDto)) //then submit data
    }
}

我正在考虑将它放在域层(你可以看到它非常孤立,但我必须对所有表单提交都这样做,这是冗余),但我仍然只想做出可靠的决定重构很费时间。希望您在这里理解我的观点,特别是关于我的类似伪代码的编码。如果有什么难以理解的地方,请随时发表评论。谢谢。

在清洁架构中,所有业务规则都用于用例交互器。主要目标是使业务规则独立于任何细节 - 来自任何框架 - 也包括 android。

Clean Architecture 然后使用 "interface adapters"(在 UI 部分称为 "controllers" 和 "presenters")在最方便内圈的数据和方便内圈的数据之间映射框架。

所以在你的情况下,你应该选择你的第二个提议——即使这意味着你必须从多个地方调用交互器并且必须映射一些数据类型。这是值得的好处(业务规则没有细节)。

有关用例交互器、控制器和演示器的更详细讨论,请参阅我在此处的帖子:https://plainionist.github.io/Implementing-Clean-Architecture-UseCases/ 这里 https://plainionist.github.io/Implementing-Clean-Architecture-Controller-Presenter/