У меня есть следующий класс с двумя членами, которые отличаются лишь незначительно:
public class TadeStrategy{
//These instances are deeply nested object graphs themselves
private TradingModelBuilder ltfTradingModel;
private TradingModelBuilder htfTradingModel;
@Inject
public TradeStrategy(@Named("ltfModel") TradingModelBuilder ltfTradingModel,
@Named("htfModel") TradingModelBuilder htfTradingModel){
this.ltfTradingModel = ltfTradingModel;
this.htfTradingModel = htfTadingModel;
}
Мой модуль для удовлетворения этих зависимостей.Я использую квалификаторы для внедрения
@Module
public class GlobalTradeSettingsModule {
@Provides
@Singleton
//this object should be treated as a singleton across the entire application
ObjectMapper mapper() {
return new ObjectMapper ();
}
@Provides
//no @Singleton, because each TradingModelBuilder should get an own instance of TadeHistory
TradeHistory tradeHistory() {
return new TradeHistory();
}
@Provides
@Singleton
@Named("ltfModel")
TradingModelBuilder ltfTradingModel(TradeHistory tradeHistory) {
return new TradingModelBuilder(tradeHistory, new Ltf());
}
@Provides
@Singleton
@Named("htfModel")
TradingModelBuilder htfTradingModel(TradeHistory tradeHistory) {
return new TradingModelBuilder(tradeHistory, new Htf());
}
}
TradingModelBuilder - это глубокий граф объектов, в котором я хочу, чтобы переданный объект TradeHistory рассматривался как одиночный объект.Как я могу это сделать?Например, предположим, что где-то глубоко в графе объектов TradingModelBuilder существует класс, подобный следующему:
public class TradHistoryConsumer{
TradeHistory th;
@Inject
public TradHistoryConsumer(TradeHistory th){
this.th = th;
}
}
Проблема с модулем, описанным выше, состоит в том, что новая TradeHistory-зависимость будет введена.Однако мне нужны экземпляры TradeHistory, которые я вставил в конкретный TradingModelBuilder (см. Модуль).Таким образом, в основном TradingModelBuilder должен стать собственным контейнером зависимостей (начиная с зависимостей, введенных через модуль) с доступом ко всем зависимостям модуля (например, ObjectMapper).