如何为房间注入我的应用程序类

问题描述 投票:0回答:1

我对匕首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)的最现代方法是什么?

android dependency-injection dagger-2
1个回答
0
投票

您的实现中存在一些问题:

问题-1:您提供DatabaseModule作为对ApplicationModule的依赖关系,这是不正确的,因为ApplicationModule内从未使用过DatabaseModule。相反,你可以通过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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.