我與一個特定的依賴注入問題所困擾,我只是似乎無法弄清楚。僅供參考:我對guice很陌生,但我有其他DI框架的經驗 - 這就是爲什麼我認爲這不應該很難實現。吉斯多個實現參數的構造函數與依賴
我在做什麼: 我正在Lagom多模塊項目,並使用吉斯作爲DI。
我想實現的目標: 注入一些接口實現的多個命名實例(讓我們稱之爲發佈者,因爲它將發佈消息給kafka主題)傳遞給我的服務。 這個'發佈者'注入了一些Lagom和Akka相關的服務(ServiceLocator,ActorSystem,Materializer等)。
現在,我想有這樣的出版商的兩個實例,並且每個將消息發佈到不同的主題(每個主題一個如此出版商實例)。
我該怎麼做到這一點? 我有一個或多個實例的同一主題沒有問題,但如果我想爲每個實例注入不同的主題名稱我有一個問題。
所以,我的出版商實施的構造看起來像這樣:
@Inject
public PublisherImpl(
@Named("topicName") String topic,
ServiceLocator serviceLocator,
ActorSystem actorSystem,
Materializer materializer,
ApplicationLifecycle applicationLifecycle) {
...
}
如果我想創建一個實例我會做這樣的在我ServiceModule:
public class FeedListenerServiceModule extends AbstractModule implements ServiceGuiceSupport {
@Override
protected void configure() {
bindService(MyService.class, MyServiceImpl.class);
bindConstant().annotatedWith(Names.named("topicName")).to("topicOne");
bind(Publisher.class).annotatedWith(Names.named("publisherOne")).to(PublisherImpl.class);
}
}
我將如何綁定多個出版商每個人都有自己的話題?
我玩弄實現另一個私有模塊:
public class PublisherModule extends PrivateModule {
private String publisherName;
private String topicName;
public PublisherModule(String publisherName, String topicName) {
this.publisherName = publisherName;
this.topicName = topicName;
}
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("topicName")).to(topicName);
bind(Publisher.class).annotatedWith(Names.named(publisherName)).to(PublisherImpl.class);
}
}
但這使我無處因爲你不能在你得到噴射器模塊的配置方法:
Injector injector = Guice.createInjector(this); // This will throw IllegalStateException : Re-entry is not allowed
injector.createChildInjector(
new PublisherModule("publisherOne", "topicOne"),
new PublisherModule("publisherTwo", "topicTwo"));
唯一的解決方案是容易的,它的工作原理是,我改變我的PublisherImpl到抽象,加上他的抽象的「getTopic()」方法,並與主題覆蓋增加兩個實現。
但是這種解決方案是瘸子。爲代碼重用添加額外的繼承並不是最佳實踐。此外,我認爲,吉斯肯定必須支持這樣的功能。
的任何建議都歡迎。 KR,內伊奇