Как вручную ввести зависимость в службу через ее конструктор? - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь внедрить служебную зависимость в конструктор для другой службы (см. Пример кода ниже).Однако исключение NoSuchBeanDefinitionException генерируется, когда я пытаюсь назначить переменную api, даже если переменная bean-компонента установлена ​​правильно.

Стоит также упомянуть, что это происходит, когда я расширяю этот сервис и инициализирую дочерний сервис.

Тогда у меня вопрос, как мне правильно внедрить сервис зависимостей в мой классозависимыйна настройку в моем Config.groovy?

class MyService {
def api

public MyService() {
def beanString = ConfigurationHolder.config.api
def bean =  ApplicationHolder.application.getMainContext().getBean(GrailsNameUtils.getPropertyName(beanString))
this.api = bean
}
}

EDIT : прояснить мою идею.У меня есть два API: один, один XML и один JSON, которые обслуживают одни и те же данные, но с разными представлениями.Тем не менее, я хочу иметь возможность установить API для использования в файле конфигурации, например, строку с именем API.

Моя идея состоит в том, чтобы иметь общий интерфейс для доступного API (ApiInterface), а затемкогда мой сервис, использующий API, инициализируется, задайте для переменной экземпляра настроенный API.

В дополнение к этому я хочу иметь возможность настраивать специфичные для службы настройки, то есть настройки для каждой службы, которая внедряет API.в файле конфигурации, который устанавливает, какой API использовать.например,


Config.groovy</p>

<p>firstService {
api = "xml"
}
secondService {
api = "json"
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

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

class MyService {

   def grailsApplication

   private apiBean // use different name so 'api' resolves as property to getApi()

   def someMethod() {
      def foo = api.someMethodCall()
      ...
   }

   def someOtherMethod() {
      def bar = api.someOtherMethodCall()
      ...
   }

   private getApi() {
      if (apiBean == null) {
         String beanString = grailsApplication.configuration.api
         apiBean =  grailsApplication.mainContext.getBean(
               GrailsNameUtils.getPropertyName(beanString))
      }
      apiBean
   }
}
0 голосов
/ 04 мая 2011

Не так много информации, чтобы продолжить. Определен ли bean-компонент, определенный в свойстве config.api, к моменту создания MyService? Как вы это гарантируете?

Я думаю, вы могли бы сделать некоторую ленивую инициализацию, чтобы обойти это, возможно:

class MyService {
   static class ApiBeanHolder {
      static api = ApplicationHolder.application.getMainContext().getBean(GrailsNameUtils.getPropertyName(ConfigurationHolder.config.api))
   }

   def doSomeWork = {
      def bean = ApiBeanHolder.api
      bean.callBeanMethod
   }
}

Не проверено, и не знаю, решит ли это вашу конкретную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...