如何为 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;
    }
}