【问题标题】:How to create multiple instances of an object using dagger in android [duplicate]如何在android中使用dagger创建对象的多个实例[重复]
【发布时间】:2021-12-31 08:17:04
【问题描述】:

我使用 dagger 为应用程序创建实例

但由于某些要求,我需要同一对象的多个实例,

任何人都可以建议这样做的好方法吗?

【问题讨论】:

  • 请显示您尝试过的一些代码,如果您使用@Singleton,它只会创建1个实例,否则每次都会创建新实例,还要检查this question

标签: android dagger-2


【解决方案1】:

您可以使用@Named 注解来实现此行为,

例子:

第 1 步: 使用带有唯一键的 @Named 注释声明您的方法

@Provides
@Singleton
@Named("cached")
fun someInstance() = return someInstance()

第 2 步: 使用带有声明键的实例

@Inject @Named("cached")
val instance: someInstance

【讨论】:

    【解决方案2】:

    您可以使用@Named("") 创建多个实例。在这里,我创建了 2 个具有不同 @Named("")

    的 Interceptor 实例

    Java:

    @InstallIn(SingletonComponent.class)
    @Module
    class NetworkModule {
        @Provides
        @Singleton
        @Named("headerInterceptor")
        private Interceptor provideInterceptor(UserManager userManager) {
            return new Interceptor() {
                @NonNull
                @Override
                public Response intercept(@NonNull Chain chain) throws IOException {
                    return chain.proceed(chain.request());
                }
            };
        }
    
        @Provides
        @Singleton
        @Named("loggingInterceptor")
        private Interceptor provideLoggingInterceptor() {
            return new LoggingInterceptor.Builder()
                    .loggable(BuildConfig.DEBUG)
                    .setLevel(Level.BODY)
                    .log(Platform.INFO)
                    .request("Request")
                    .response("Response")
                    .build();
        }
    
        @Provides
        @Singleton
        private OkHttpClient provideOkHttpClient(
                Cache cache,
                @Named("headerInterceptor") Interceptor interceptor,
                @Named("loggingInterceptor") Interceptor loggingInterceptor
        ) {
            return new OkHttpClient.Builder()
                    .cache(cache)
                    .connectTimeout(60, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .writeTimeout(60, TimeUnit.SECONDS)
                    .addInterceptor(interceptor)
                    .addInterceptor(loggingInterceptor)
                    .build();
        }
    }
    

    科特林

    @InstallIn(SingletonComponent::class)
    @Module
    class NetworkModule {
        @Provides
        @Singleton
        @Named("headerInterceptor")
        fun provideInterceptor(userManager: UserManager): Interceptor {
            return Interceptor { chain ->
                chain.proceed(chain.request())
            }
        }
    
        @Provides
        @Singleton
        @Named("loggingInterceptor")
        fun provideLoggingInterceptor(): Interceptor {
            return LoggingInterceptor.Builder()
                .loggable(BuildConfig.DEBUG)
                .setLevel(Level.BODY)
                .log(Platform.INFO)
                .request("Request")
                .response("Response")
                .build()
        }
    
        @Provides
        @Singleton
        fun provideOkHttpClient(
            cache: Cache,
            @Named("headerInterceptor") interceptor: Interceptor,
            @Named("loggingInterceptor") loggingInterceptor: Interceptor
        ): OkHttpClient {
            return OkHttpClient.Builder()
                .cache(cache)
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .addInterceptor(interceptor)
                .addInterceptor(loggingInterceptor)
                .build()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多