Guice: использовать один и тот же экземпляр независимо и внутри переплета - PullRequest
1 голос
/ 24 октября 2019

Можно ли создать один одноэлементный объект и иметь возможность внедрить его независимо как один экземпляр, или как часть набора или карты?

Например, у меня есть два объекта, подобных этому:

@Provides
@Singleton
@Named(value = "bike.listener")
fun bikeListener(
    mapper: ObjectMapper,
    amazonSNS: AmazonSNS,
    kafkaPublisher: KafkaPublisher
): PublishingListener {
    return PublishingListener(
        mapper = mapper,
        amazonSns = amazonSNS,
        kafkaPublisher = kafkaPublisher
    )
}

@Provides
@Singleton
@Named(value = "car.listener")
fun carListener(
    mapper: ObjectMapper,
    amazonSNS: AmazonSNS,
    kafkaPublisher: KafkaPublisher
): PublishingListener {
    return PublishingListener(
        mapper = mapper,
        amazonSns = amazonSNS,
        kafkaPublisher = kafkaPublisher,
    )
}

... и я использую их в своих классах, вводя их напрямую через параметры @Named. Но у меня также есть вариант использования, где я хочу внедрить их обоих в набор.

Так что-то вроде:

@Inject
Set<PublishingListener> listeners; // carListener and bikeListener here

Можно ли создать MultiBinder, который будет использоватьуже определенные экземпляры? Как я могу использовать один и тот же экземпляр в наборе и отдельно?

1 Ответ

1 голос
/ 25 октября 2019

В вашем Guice Module вы можете привязать эти экземпляры к набору, подобному следующему:

@Provides
fun publisherListenerSet(
    @Named("car.listener") val carListener: PublisherListener,
    @Named("bike.listener") val bikeListener: PublisherListener
): Set<PublisherListener> { 
    setOf(carListener, bikeListener)
}

Или вы можете использовать:

protected override fun configure() {
    val publishingListenerSetBinder = Multibinder.newSetBinder(binder(), PublisherListener::class.java)
    publishingListenerSetBinder.addBinding().annotatedWith(Names.named("car.listener"))!!.to(PublishingListener::class.java)
    publishingListenerSetBinder.addBinding().annotatedWith(Names.named("bike.listener"))!!.to(PublishingListener::class.java)
}

Поскольку вы на самом деле не вызываетеВ методе провайдера Injector может поддерживать единство того, что предоставляет провайдер.

...