gpt4 book ai didi

java - 使用 Dagger 2 时,我应该将库初始化移动到哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:19 26 4
gpt4 key购买 nike

我有这段代码可以初始化 Calligraphy 默认配置。

public class MyApplication extends Application {

@Override
public void onCreate() {
super.onCreate();

// The initialization I want to move
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/MyFont.ttf")
.build()
);
}
}

我想在我的项目中使用 Dagger 2,但我不完全了解我应该创建哪些类以及将这些代码移到哪里才能保持项目整洁?

最佳答案

简而言之,您可能不会移动任何东西。这个库的问题在于它使用静态方法进行初始化和使用。尝试进行依赖项注入(inject)时,静态方法很痛苦。

图书馆(或者为什么你不会改变任何东西)

看起来这个库“只是”通过包装上下文来切换使用的字体。因此,它并没有真正为您的项目提供业务逻辑,而只是添加到您的 View /UI。

如果您希望能够进行单元测试(注入(inject)模拟)或轻松交换模块/行为,那么注入(inject)依赖项而不是仅仅调用静态方法是最有用的。在全局更​​改字体的情况下,两者似乎都不太可能。

另一方面,如果您真的需要(或希望)能够测试它,或者只是有一个干净的设计...

...包装

静态方法很痛苦,因为您不能让对象持有逻辑。除非你把它们包起来。要使用静态方法正确执行 DI,您必须定义自己的接口(interface)。

public interface CalligraphyManager {
/**
* Called on app start up to initialize
*/
void init();

// other methods, like wrapping context for activity
Context wrap(Context context);
}

您现在有了一些管理器来访问静态方法。实现应该相当简单,因为您想进行适当的 DI,init() 所需的应用程序上下文和路径将被传递到您的实现的构造函数中。因此,您的管理器的创建可以由您的 ApplicationModule 处理——只需添加一些 provides 方法

@Singleton
@Provides
// You would also have to provide the path from somewhere or hardcode it
// left as an exercise for the reader
CalligraphyManager provideCalligraphyManager(Context context, String path) {
return new ActualCalligraphyManager(context, path);
}

您的应用程序将如下所示:

public class MyApplication extends Application {

@Inject
CalligraphyManager mCalligraphy;

@Override
public void onCreate() {
super.onCreate();

mComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
mComponent.inject(this);

// call the initialization
mCalligraphy.init();
}
}

其他一切如常。您的应用程序组件图中有一个单例对象,因此您可以将相同的对象注入(inject)到您的 Activity 中并在适当的地方调用“wrap”。

测试/模拟呢?

由于这样做的全部原因是为了使其“可测试”,您现在可以轻松地提供模拟/ stub 对象。

创建管理器的另一个实现,其中 init() 什么都不做,而 wrap(Context) 只会返回相同的上下文——一个简单的 stub 对象。

关于java - 使用 Dagger 2 时,我应该将库初始化移动到哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35824634/

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