我对匕首2感到非常困惑。人们提供解决方案的方式有很多。如何注入我的应用程序以提供数据库?
我已经有我的数据库模块,这是一个提供我的应用程序的应用程序模块。我的applicationComponent里面有一个构建器(不知道它做什么)。使用该生成器无法在我的应用程序类中构建它!?
应用程序类:
public class OnSiteApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
AppComponent:
@Singleton
@Component(modules = {ApplicationModule.class, AndroidInjectionModule.class})
public interface AppComponent extends AndroidInjector<OnSiteApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(OnSiteApplication onSiteApplication);
}
应用程序模块:
@Module(includes = DatabaseModule.class)
public class ApplicationModule {
private static final String SHARED_PREFERENCE_NAME = "OnSitePreferences";
private final OnSiteApplication application;
public ApplicationModule(OnSiteApplication appContext) {
this.application = appContext;
}
@Provides
public OnSiteApplication provideOnSiteApplication() {
return application;
}
}
数据库模块:
@Module
public class DatabaseModule {
@Provides
public static OnSiteDatabase provideDatabase(Application appContext) {
return Room.databaseBuilder(appContext,
OnSiteDatabase.class, OnSiteDatabase.DATABASE_NAME)
.fallbackToDestructiveMigration()
.build();
}
@Provides
public static ProjectDao provideProjectAccess(OnSiteDatabase onSiteDatabase) {
return onSiteDatabase.projectDao();
}
}
大多数解决方案都在一岁或更老。注入基于OS的类(如Application)的最现代方法是什么?
答案 0 :(得分:1)
在您的实现中存在一些问题:
问题-1:
您提供1
作为对DatabaseModule
的依赖,这是不正确的,因为ApplicationModule内从未使用过DatabaseModule。相反,你可以通过
ApplicationModule到DatabaseModule作为应用程序上下文用于创建数据库。 [但这不是必需的,请在下面检查]
问题-2:
这里的ApplicationModule
是无用的,因为已经通过ApplicationModule
提供了Application
。因此,您可以从此处删除@BindsInstance
。
因此最终的实现方式如下:
ApplicationModule
然后@Singleton
@Component(modules = {DatabaseModule.class, AndroidInjectionModule.class})
public interface AppComponent extends AndroidInjector<OnSiteApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(OnSiteApplication onSiteApplication);
}
,如下创建OnSiteApplication
:
AppComponent