我正在开发一个实现 MVP 和干净架构的 android 应用程序。我有以下场景:
目前 strings.xml 文件在 app 模块中,但我在考虑它是否应该在 commons 模块中。问题是,有时演示者必须将文本设置到视图,因此演示者应该需要访问 strings.xml。我想过两种可能的解决方案:
1) 在核心模块上创建一个 TextHelper 接口,该接口将在应用程序模块上实现并注入到演示者中,因此演示者将使用这个助手来获取它需要的字符串。 (这是我实施的解决方案)。
2) 将 strings.xml 文件移动到公共模块,以便可以从核心模块访问该文件。但是这个解决方案会有一个问题:演示者没有上下文。
你怎么看?什么是最好的方法?
提前致谢
如果您的视图嵌套了与字符串相关的
if
/else
,那么它们可能应该进行单元测试。因此,该逻辑应该留在演示者或用例中,这样可以更快地进行测试。
你的问题是关于如何检索实际的字符串,因为它们位于 Clean Architecture 方案的“外层”,即在 Context 对象中。恕我直言,您的
TextHelper
是正确的方法,因为它允许在编写单元测试时注入模拟:您感兴趣的是字符串是如何 processed,而不是字符串实际上是如何 look。我正在尝试一种非常相似的方法并将其称为StringsRepository
.
不确定的一点是存储库 API 应该是什么样子:
getString(@StringRes int stringResId, Object... formatArgs)
这样简单包装Context.getString()
的单一方法:实现起来非常简单,但会使演示者依赖于您的R.string
类,这反过来又要求strings.xml
与您的代码位于同一模块中测试;protected
可见性。您的情况的最佳选择是(2)或(3),但您的里程可能会有所不同。
您可以使用
Application
类从应用程序的任何位置获取上下文。
public class MVPApplication extends Application {
private static Context context;
public static Context getContext() {
return context;
}
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
}