Инъекция зависимости от класса, установленного в другом месте - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь внедрить ehcache через Play Framework.Я внедряю его в сопутствующий класс, но этот класс создается в абстрактном классе в другом месте, а также в сопутствующем объекте.Я не хочу вводить что-либо в абстрактный класс, потому что он используется где-то еще.

Например, это, в основном, способ настройки класса-объекта и объекта-компаньона (удалены некоторая логика и расширения для лучшей читаемости):

class Setting @Inject()(cached: DefaultSyncCacheApi) {
   def isCached(id:String): Boolean = {
       val cachedItem = cached.get(id)
       cachedItem.isDefined
   }
}

object Setting {
   def getId(id:String): Setting = {
      val setting = new Setting //I know this doesn't work
      if (setting.isCached(id)) {
          //retrieval logic
      }
      setting
   }
}

Это абстрактный класс, в котором он создается:

abstract class UsingSettingAbstract {
   def methodUsingSetting(): String = {
       val setting = new Setting
       val str = new String
       //logic in here
       str
   }
}

Я попытался создать пустой конструктор в классе Setting с помощью def this() { } и создать цепочкуконструкторов, но до сих пор не удалось получить успешный ввод кэша.

Я сделал разные версии ниже, инициализируя переменную cache с помощью cached или пытаясь пройти через cached:

class Setting @Inject()(cached: DefaultSyncCacheApi) {
   val cache:DefaultSyncCacheApi
   def this() {
      this(cache)
   }
}

Есть ли способ заставить DI работатьс этой настройкой, или что-то вроде заводского образца будет работать лучше?

1 Ответ

1 голос
/ 31 мая 2019

С помощью guice вы можете передать любой созданный экземпляр в метод инжекторов "requestInjection ()". Это вызовет внедрение метода и поля в этом экземпляре.

Так что, пока у вас есть доступ к инжектору, вы можете делать инъекции.

...