gpt4 book ai didi

android - 如何在没有 Dagger 的情况下在 MVP 中使用共享首选项并且不会导致 Presenter 依赖于上下文?

转载 作者:IT老高 更新时间:2023-10-28 21:37:06 33 4
gpt4 key购买 nike

我正在尝试在没有 Dagger 的情况下实现 MVP(出于学习目的)。但我遇到了问题 - 我使用存储库模式从缓存(共享首选项)或网络获取原始数据:

Shared Prefs| 
|<->Repository<->Model<->Presenter<->View
Network|

但是为了让我的手放在共享首选项上,我必须放在某个地方,比如

presenter = new Presenter(getApplicationContext());

我使用 onRetainCustomNonConfigurationInstance/getLastCustomNonConfigurationInstance 对来保持 Presenter “保留”。

public class MyActivity extends AppCompatActivity implements MvpView {

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
presenter = (MvpPresenter) getLastCustomNonConfigurationInstance();

if(null == presenter){
presenter = new Presenter(getApplicationContext());
}

presenter.attachView(this);
}

@Override
public Object onRetainCustomNonConfigurationInstance() {
return presenter;
}

//...
}

那么如何在没有 Dagger 的情况下在 MVP 中使用 Shared Preferences 并且不会导致 Presenter 依赖于上下文?

最佳答案

你的 Presenter 首先不应该是 Context 依赖的。如果您的演示者需要 SharedPreferences,您应该将它们传入 构造函数
如果您的演示者需要 Repository,再次将其放入 constructor。我强烈建议观看Google clean code talks因为他们很好地解释了为什么您应该使用适当的 API。

这是正确的依赖管理,它将帮助您编写干净、可维护和可测试的代码。并且无论您使用 Dagger 、其他 DI 工具还是自己提供对象都无关紧要。

public class MyActivity extends AppCompatActivity implements MvpView {

@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences preferences = // get your preferences
ApiClient apiClient = // get your network handling object
Repository repository = new Repository(apiClient, preferences);
presenter = new Presenter(repository);
}
}

可以通过使用工厂模式或一些 DI 框架(如 dagger)来简化此对象创建,但正如您在上面看到的那样,Repository 和您的 Presenter 都不依赖于 Context。如果您想提供实际的 SharedPreferences,则只有它们的 创建 将取决于上下文。

您的存储库依赖于一些 API 客户端和 SharedPreferences,您的演示者依赖于 Repository。只需向它们提供模拟对象即可轻松测试这两个类。

没有任何静态代码。没有任何副作用。

关于android - 如何在没有 Dagger 的情况下在 MVP 中使用共享首选项并且不会导致 Presenter 依赖于上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137624/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com