【发布时间】:2021-06-22 07:26:09
【问题描述】:
我有多个视图模型可以访问单个存储库(一个活动和其余片段)。
AdminActivityViewModel
AdminListUsersViewModel
AdminUserTransactionsViewModel
...还有更多
我的AdminRepo 类有多个构造函数,因此我可以从 ViewModel 传递回调方法
public AdminRepo(Application application, AdminActivityCallback callback) {
this.callback = callback;
BaseApplication baseApplication = (BaseApplication) application;
RetrofitClient client = baseApplication.getRetrofitClient();
adminService = client.getRetrofit().create(AdminService.class);
SharedPrefManager sharedPref = SharedPrefManager.getInstance(application);
AuthHeader authHeader = new AuthHeader(
sharedPref.getIdToken(),
sharedPref.getIdClient(),
sharedPref.getUserEmail()
);
client.setAuthHeader(authHeader);
}
public AdminRepo(Application application, AdminListUsersCallback callback) {
//Exact same code in constructor as above ^
}
public AdminRepo(Application application, AdminUserTransactionsCallback callback) {
//Exact same code in constructor as above ^
}
在每个ViewModels 中,我正在创建AdminRepo 的一个实例(这可能是一个不好的做法),但我不知道如何改进它。
public class AdminActivityViewModel extends AndroidViewModel implements AdminActivityCallback
public AdminActivityViewModel(@NonNull Application application) {
super(application);
repo = new AdminRepo(application, this);
}
我如何设计我的 AdminRepo 和 ViewModel 以便它们共享一个存储库,而无需每次都创建昂贵的 AdminRepo 类?
我考虑过使用 .getInstance() 方法使我的 AdminRepo 类成为单例,但我收到了很多关于存储库类不应是静态或单例的相互矛盾的帖子,这让我对我的内容感到非常困惑应该这样做。
【问题讨论】:
-
为什么您认为在每个 VM 中创建一个新实例不好?没有什么不妥。如果您没有理由使用 Singleton,则不要创建一个,如果您确实有理由使用它,请继续。对此没有真正正确的答案,仅取决于具体情况。话虽这么说,如果您需要许多不同的回调,那么您可能可以将该回购进一步分解为单独的回购,我也不会将 Application 传递给它们,传递您需要的信息,这样您就不会依赖 Android System
-
因为创建不必要的对象不好?在课堂上,他们教你应该始终减少对象创建的数量。我觉得您可以重用
AdminRepo类,而不是每次都创建一个新类。 -
不必要的工作也会造成不必要的复杂性,这不像您在几秒钟内创建数百个实例。处理完它们后,它们会收集垃圾
-
我已经为
User、Login和Admin实体创建了单独的存储库类。如果我要拆分Admin,我将不得不再创建5 个额外的存储库类,AdminListUsersRepo、AdminListTransactionsRepo````, etc. Also why is having a dependency on theApplication``` 不好?我可以在应用程序的生命周期内只拥有一个 SharedPreferences 和 Retrofit 实例,然后只检索这些实例而不是创建一个新实例。
标签: android repository-pattern android-viewmodel android-mvvm