如何为 Room 注入我的应用程序 class
How to inject my application class for Room
我对 dagger 2 真的很困惑。人们提供解决方案的方式有很多种。我如何注入我的应用程序来提供我的数据库?
我已经有了我的数据库模块,一个提供我的应用程序的应用程序模块。我的 applicationComponent 里面有一个构建器(不知道它做了什么)。使用该构建器无法在我的应用程序中构建它 class!?
申请class:
public class OnSiteApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
应用程序组件:
@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 的 class 应用程序的方法是什么?
在您的实现中存在一些问题:
问题 - 1:
您提供 DatabaseModule
作为对 ApplicationModule
的依赖,这是不正确的,因为 DatabaseModule 从未在 ApplicationModule 中使用过。相反你可以通过
ApplicationModule 到DatabaseModule 作为应用程序上下文用于创建数据库。 [但不是必需的,请查看下方]
问题 - 2:
这里 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
:
public class OnSiteApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder().application(this).build();
}
public AppComponent getAppComponent() {
return appComponent;
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
我对 dagger 2 真的很困惑。人们提供解决方案的方式有很多种。我如何注入我的应用程序来提供我的数据库?
我已经有了我的数据库模块,一个提供我的应用程序的应用程序模块。我的 applicationComponent 里面有一个构建器(不知道它做了什么)。使用该构建器无法在我的应用程序中构建它 class!?
申请class:
public class OnSiteApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
应用程序组件:
@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 的 class 应用程序的方法是什么?
在您的实现中存在一些问题:
问题 - 1:
您提供 DatabaseModule
作为对 ApplicationModule
的依赖,这是不正确的,因为 DatabaseModule 从未在 ApplicationModule 中使用过。相反你可以通过
ApplicationModule 到DatabaseModule 作为应用程序上下文用于创建数据库。 [但不是必需的,请查看下方]
问题 - 2:
这里 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
:
public class OnSiteApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder().application(this).build();
}
public AppComponent getAppComponent() {
return appComponent;
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}