2015-10-06 5 views
1

Grails 2.4.5 здесь. Я сделал grails create-service com.example.service.Simple, который создал SimpleService для меня, который я тогда модифицированную выглядеть так:Конфигурирование и инъекция Услуги Grails

class SimlpeService { 
    SimpleClient simpleClient 

    Buzz doSomething(String derp) { 
     // ... 
     Fizz fizz = simpleClient.doSomething(derp) 
     // ... 
     fizz.asBuzz() 
    } 
} 

теперь я могу «впрыснуть» контроллеры с SimpleService так:

class MyController { 
    SimpleService simpleService 

    def index() { 
     // etc... 
    } 
} 

Но как я configure/wire SimpleService с правильным экземпляром SimpleClient. Давайте предположим, что SimpleClient, как правило, построены таким образом:

SimpleClient simpleClient = SimpleClientBuilder 
    .withURL('http://simpleclientdev.example.com/simple') 
    .withAuth('luggageCombo', '12345') 
    .isOptimized(true) 
    .build() 

В зависимости от того, в какой среде я нахожусь, я может хочу, чтобы мой SimpleClient экземпляр для подключения к simpleclientdev.example.com, simpleclientqa.example.com или даже simpleclient.example.com. Кроме того, я могу использовать разные учетные данные для аутентификации, и я мог бы/не хотел бы, чтобы он был «оптимизирован» и т. Д. Точка: Как мне ввести SimpleService с помощью экземпляра SimpleClient?

+0

Почему бы не создать службу, которая настраивает и возвращает «SimpleClient» в соответствии с тем, как она настроена для вашей среды через вашу конфигурацию (например, «Config.groovy»)? Так я подхожу к нему ... –

ответ

1

Вы можете использовать PostConstruct аннотаций в Java на одном из вашего метода в вашем распоряжении, чтобы сделать материал, который Вы хотите. Из документов:

PostConstruct аннотации используются на методе, который должен быть выполнен после того, как инъекция зависимостей делаются для выполнения любых инициализации.

SimpleService.groovy

import javax.annotation.PostConstruct 

class SimlpeService { 

    private SimpleClient simpleClient 

    def grailsApplication 

    @PostConstruct 
    void postConstruct() { 
     def config = grailsApplication.config.client.data 

     SimpleClient simpleClient = SimpleClientBuilder 
      .withURL(config.url) 
      .withAuth('luggageCombo', config.username) 
      .isOptimized(config.optimized) 
      .build() 
    } 

    Buzz doSomething(String derp) { 
     // ... 
     Fizz fizz = simpleClient.doSomething(derp) 
     // ... 
     fizz.asBuzz() 
    } 
} 

Так, Grails или Spring будет вызывать этот метод postConstruct() автоматически, когда все зависимости (в данном случае grailsApplication) для этой службы разрешаются и любой из метода обслуживания вызывается. Упомянуто, что этот метод должен вызывать перед вами доступ к любому члену или методу поля SimpleService.

Теперь, все уже настроено, как вы сказали, что вам может понадобиться для вызова другого URL с другими учетными данными, только вы должны определить их в вашем Config.groovy как:

environments { 
    development { 
     client { 
      data { 
       url = "simpleclientdev.example.com" 
       username = "test" 
       optimized = false 
      } 
     } 
    } 
    production { 
     client { 
      data { 
       url = "simpleclient.example.com" 
       username = "johndoe" 
       optimized = true 
      } 
     } 
    } 
} 

Теперь, когда вы run-app с развитием режим и вызов simpleService.doSomething() в вашем примере контроллер автоматически попадет на URL-адрес simpleclientdev.example.com с тестовыми учетными данными, а при его развертывании с использованием производственной среды тот же метод simpleService.doSomething() достигнет simpleclient.example.com с optimized, установленным на true.

Update Ключевой момент здесь основан на ваш вопрос в том, что мы не будем инъекционными различные экземпляров SimpleService поскольку услуги являются синглтоном по умолчанию. Вместо этого мы меняем значение, связанное с сервисом, основанным на среде.

0

Похоже, вам нужно понять немного больше о том, как использовать пружину, возможно? Grails Spring Docs

Вы также можете делать вещи, как это в вашем классе обслуживания

@PostConstruct 
void init() { 
    //configure variables, etc here ... 
    log.debug("Initialised some Service...") 
} 
Смежные вопросы