我目前正在编写我的第一个 android 项目,我想根据依赖注入(inject)模式对其进行重构。从我的应用程序中最简单的 Activity 开始 - 初始屏幕 - 我问自己,我是否正确理解了模式的概念。
到目前为止,这是我的 SplashActivity
的代码:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
Fragment fragmentToDisplay = null;
if (!(getIntent().getBooleanExtra("isLaunch", true))) {
fragmentToDisplay = new LoginFragment();
} else {
if (savedInstanceState == null) {
fragmentToDisplay = new SplashFragment();
}
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
}
}
根据 IntentExtra "isLaunch"
的内容,我想显示不同的 fragment 。现在,我读到每一个 new ServiceXY()
都会使代码的可测试性降低,这实际上不是依赖注入(inject)的目标。所以我重构了我的代码:
public class SplashActivity extends AppCompatActivity {
private SplashFragment splashFragment;
private LoginFragment loginFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
splashFragment = new SplashFragment();
loginFragment = new LoginFragment();
Fragment fragmentToDisplay = null;
if (!(getIntent().getBooleanExtra("isLaunch", true))) {
fragmentToDisplay = loginFragment;
} else {
if (savedInstanceState == null) {
fragmentToDisplay = splashFragment;
}
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
}
}
然而,这似乎并没有太大的不同。如果我想测试,如果显示正确的 fragment ,这如何提高我的代码的可测试性?感谢转发。
最佳答案
您是对的,您的更改不会产生太大影响,也不会注入(inject)依赖项。由于您的 SplashActivity 对象负责创建 fragment ,因此它们仍然依赖于 SplashActivity 对象。
如果你想使用依赖注入(inject),你必须在 SplashActivity 之外的某个地方创建 fragment 对象,然后将它们传递到对象中。
根据依赖注入(inject)原则,您的服务将是 fragment 类型,使用该服务的客户端将是 SplashActivity,因此您需要另一个对象将正确的服务“注入(inject)”到客户端。 https://stackify.com/dependency-injection/
您可以使用第一个 fragment 中的代码,而不是检查 oncreate 中的 bool 值来设置正确的 fragment 类型,您可以简单地将 fragment 对象传递到 splashactivity 类中,然后转到 fragmentToDisplay = fragmentPassedIntoClass
。然后您可以测试传递到类中的 fragment 是否是正确的类型,以及事务是否正确开始。注入(inject)器将负责传递正确的 fragmentPassedIntoClass
MainFragment fragment;
if(splash){ fragment = new SplashFragment(); }
if(login){fragment = new LoginFragment(); }
// Pass fragment variable into splash activity
SplashActivity activty = new SplashActivity(fragment);
public class SplashActivity{
MainFragment mFragment;
public SplashActivty(MainFragment fragment){
mFragment = fragment;
}
}
关于android - 我是否正确地在 Activity 代码中进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710826/