Android Clean Architecture - 访问资源字符串的正确方法

hta*_*oya 7 android repository android-resources clean-architecture

我喜欢干净的架构,但一直困扰我的是跨层访问资源文件。

我知道除 View 层之外的其他层不应该引用与 Android SDK 相关的任何内容。但有时需要管理特定的文本,层次越深,就越让人头疼。

具体来说,我有以下情况让我不确定如何正确实施:

当屏幕打开时,应显示警告消息。该警告消息可以根据标志从远程源检索,或者如果标志关闭则从本地字符串获取。

据我了解,演示者不应该介意标志的值,而只需调用 UseCase.getWarningMessage() 即可。更深入地说,用例可能应该只获取标志值并将其发送到存储库(我仍然不确定是否应该直接在存储库中访问该标志)。

之后,存储库将检查该标志并检索远程消息或只是从本地字符串中获取它。

此时,存储库如何获取资源字符串?如果需要访问资源,是否应该将依赖项一直发送到存储库层?演示者是否应该负责管理标志以了解是否应远程或本地检索警告消息?

alp*_*zge 0

“...View 层以外的层不应引用与 Android SDK 相关的任何内容。” 根本就是错误的。如果某个模块/类依赖于其他某个模块/类,那么它就依赖于该模块/类。没有办法解决它。

对于 Android,您不应该做的是,您的非 UI 模块不应保留 UI 相关对象(活动、片段、视图)的引用,否则会阻止它们被垃圾收集。但是,当您在具有应用程序范围的类中需要Context时(例如以 android 推荐的方式实现的存储库类),使用 application Context是完全可以的。

编辑 既然你问这个问题,我假设你没有使用依赖注入框架。

您可能会遵循开发人员指南,并将存储库实现为单例。现在传递 ApplicationContext 实例的简单方法可以是: 1.在存储库类中定义一个android.app.Application类型的静态字段。提供一个 setter 来注入该依赖项。

public class MyRepo {
   private static Application application;
   ..................

   public static void injectApplication(Application app) {
        if(null == application) {
            application = app;
        }
   }
}

Run Code Online (Sandbox Code Playgroud)

也许您可以在使用任何getInstance()方法之前记录您的类以调用此新方法。

  1. 扩展 android.app.Application 类。重写onCreate()并将“this”注入存储库。
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MyRepo.injectApplication(this);
    }
.........
}
Run Code Online (Sandbox Code Playgroud)
  1. 不要忘记修改新应用程序类的清单文件。