android - MVVM - 如何跨多个 ViewModel 共享单个存储库类

标签 android repository-pattern android-viewmodel android-mvvm

我有多个访问单个存储库的 View 模型(一个 Activity 和其余 fragment )。

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 类?

我已经考虑过让我的 AdminRepo 类成为带有 .getInstance() 方法的单例,但是我收到了很多关于 Repository 类不应该如何的相互矛盾的帖子静态或单例,这让我对我应该做什么感到非常困惑。

https://stackoverflow.com/a/7464235/11110509

最佳答案

如果所有 View 模型同时存在,并且存储库不保留任何状态,您可以共享相同的存储库实例并为每个 View 模型提供该实例。然而,这里没有魔法的地方 - 如果您创建存储库的实例,则必须保留对此的引用,以便您可以将相同的对象传递给其他 View 模型。

首先,您需要使 View 模型接受外部依赖项(我建议查看 dependency injection 模式)

YourViewModel( /* other dependencies ..., */ AdminRepo adminRepo) 

一旦你有了它,你需要创建一个 View 模型工厂。 This post描述得很好,但长话短说:实现 ViewModelProvider.Factory ,它将保留您的存储库实例并在 ViewModelProvider 中使用它来获取 View 模型的实例。

通过此设置,您将可以控制创建的实例以及创建其他 View 模型的方式。这可以通过使用依赖注入(inject)框架(Koin、dagger、hilt)来实现自动化。如果您使用 Dagger 或 Hilt (Google 推荐),那么您可以通过提供适当的注释将对象生命周期交给框架。让我们试试这个例子:

@Singleton
class MyRepository { ...

@HiltViewModel
class MyViewModel {
   MyRepository repo;
   @Inject MyViewModel(MyRepository repo) { ...
   ...

此代码将使您的存储库成为与应用程序生命周期相关的单例。通常您不想这样做,因为即使您移动到不需要该对象的屏幕,该对象也会保留在内存中。但是您可以使用@ActivityScoped,以便您的存储库与 Activity 一样长。

现在,如果这些 View 模型具有不同的生命周期并且它们不重叠,那么为每个 View 模型创建一个新的实例就完全没问题了。当您不再需要不必要的对象时,您不想将它们保留在内存中。

关于android - MVVM - 如何跨多个 ViewModel 共享单个存储库类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66800463/

相关文章:

c# - 存储过程的存储库模式

c# - 单一责任原则和存储库

android - 带有 viewmodel 和实时数据的 ViewPager,所有 6 个选项卡数据都被最后一个选项卡数据替换

c# - 如何使用 SimpleIOC 注册通用存储库

android - 如何获取光标的实际位置?

java - 如何使用for循环在固定 View 中打印字符串

android - LibGdx GLES2.0 立方体纹素拉伸(stretch)

android - 数据绑定(bind)不适用于选项卡项文本属性

java - 如何对在 AndroidViewModel 类内部进行改造调用的方法进行单元测试?

android - AlarmManager 几天后停止工作