gpt4 book ai didi

android - void inject(Activity activity) 和 SomeComponent getSomeComponent() 的区别

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:09 26 4
gpt4 key购买 nike

通常在使用 Dagger 2 和 android 时,我有以下内容:

@Singleton 
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {


void inject(MainActivity activity);
}

public class MainActivity extends Activity {
@Inject SharedPreferences mSharedPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((DemoApplication) getApplication())
.getComponent()
.inject(this);
}
}

但是最近我看到了这个:

@Singleton 
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
SharedPreferences getSharedPreferences();
}

public class MainActivity extends Activity {
SharedPreferences mSharedPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSharedPrefs = ((DemoApplication) getApplication())
.getComponent().getSharedPreferences();
}
}

我省略了 DemoApplication 类和 Module 类,它们是标准的。

这两种方法有什么区别?两者的优缺点?也许是对还是错?

最佳答案

dependency inversion principle软件工程建议我们应该尝试依赖抽象而不是具体化。

因此,您应该更喜欢在 Activity 中使用 @Inject 注解(抽象)进行字段注入(inject),而不是从 Dagger 组件(具体)调用 provision 方法。

为什么?您会注意到 @Inject 注释是 javax.inject 包的一部分。这是作为 JSR330 的一部分引入 Java 的依赖项注入(inject) API 标准。 .还有其他 DI 框架,例如 Guice 和 Toothpick,可以使用这些注释。如果您将来必须切换 DI 框架,那么使用 @Inject 注释会更容易。是的,确实发生了您必须更改 DI 框架的情况。 Roboguice是最近停用的流行 DI 框架的示例。

为了说明,让我们获取您的 Activity,添加一些依赖项,并提取一个注入(inject)方法,如下所示:

public class MainActivity extends Activity { 
@Inject SharedPreferences mSharedPrefs;
@Inject Foo foo;
@Inject Bar bar;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@VisibleForTesting
protected void injectMembers() {
((DemoApplication) getApplication())
.getComponent()
.inject(this);
}
}

一个疯狂的(新的)DI 框架出现了!您现在必须更改您的应用程序才能快速使用它!您使用 JSR330。 super 有效! (翻译:您可以重新使用您的 JSR330 @Inject 注释,因为新的 DI 框架支持它们)。如果您已更改为新的类似 Guice 的框架,您需要做的就是重写您的方法:

    @VisibleForTesting
protected void injectMembers() {
GuiceLikeInjector.getInjector(this).injectMembers();
}

相比之下,如果您使用 .getSharedPreferences()getFoo() 手动注入(inject)这些字段,则效果不佳 - 您必须更改很多行代码。

关于android - void inject(Activity activity) 和 SomeComponent getSomeComponent() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41843947/

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