2011-08-20 21 views
63

Ben son Grails 2.0 kilometre taşı elde ettim ve ConfigurationHolder sınıf için bir kullanımdan kaldırılması uyarısı görüyorum:Grails yapılandırması Grails 2.0'a nasıl erişilir?

org.codehaus.groovy.grails.commons.ConfigurationHolder 

kullanımdan kaldırılması mesajı sadece bana çok yardımcı olmadığı "yerine bağımlılık enjeksiyon kullan" diyor. Bağımlılık enjeksiyonunu anlıyorum, ancak düzgün bir Grails konfigürasyonu ile bir fasülyeyi nasıl kurabilirim? Yapılandırmaya Denetleyicilerim ve Etiketlerim dışındaki yerlerden (BootStrap gibi) erişmem gerekiyor.

cevap

101
  • örnek bir conf olduğunu kullanılarak src/groovy veya src/java, tel o kadar ki conf/spring/resources.groovy

    // src/groovy/com/example/MyBean.groovy 
    class MyBean { 
        def grailsApplication 
    
        def foo() { 
         def bar = grailsApplication.config.my.property 
        } 
    } 
    
    // resources.groovy 
    beans = { 
        myBean(com.example.MyBean) { 
         grailsApplication = ref('grailsApplication') 
         // or use 'autowire' 
        } 
    } 
    
  • Başka herhangi bir yerde, yapılandırma nesnesini gereksinim duyulan sınıfa geçirmesi ya da gereken belirli özellikleri iletmesi en kolay yoldur.

// src/groovy/com/example/NotABean.groovy class NotABean { def foo(def bar) { ... } } // called from a DI-supporting artifact class MyController { def grailsApplication def myAction = { def f = new NotABean() f.foo(grailsApplication.config.my.property) } } 

Güncelleme:

Burt Beckwith Son zamanlarda bu blog yayınları birkaç yazdı. One discusses usinggetDomainClass() etki alanı sınıflarından, diğeri ise creating your own holder class (yukarıdaki çözümlerden hiçbiri uygun değilse) seçeneğini sunar.

+0

Rob, çok yararlı bir cevap. Teşekkürler. – Polaris878

18

Kaynak dosyanıza "grailsApplication" enjekte edebilirsiniz. Eğer bir fasulye bunu gerekiyorsa, sadece grailsApplication

class MyController { 
    def grailsApplication 

    def myAction = { 
     def bar = grailsApplication.config.my.property 
    } 
} 
  • enjekte bağımlılık enjeksiyon destekleyen bir eser içinde gerekirse burada/Bootstrap.groovy

    class BootStrap { 
    
        def grailsApplication 
    
        def init = { servletContext -> 
         println grailsApplication.config 
        } 
    
        def destroy = { 
        } 
    } 
    
  • +0

    +1, çok iyi öneri! – Polaris878

    10

    yapılandırma almak için başka olmayan kullanım dışı yoludur: Böyle servlet sınıfları veya statik yöntemleri olarak, hiçbir enjekte ebeveyn mevcut olduğu ortamlarda çalışır

    ApplicationContext context = ServletContextHolder.servletContext. 
         getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) 
         as ApplicationContext 
        ConfigObject config = context.getBean(GrailsApplication).config 
    

    .

    56

    grailsApplication bir alternatif Holders sınıfı

    import grails.util.Holders 
    
    def config = Holders.config 
    

    Sen Hamillerinin kapalı doğrudan yapılandırma olsun yarar sınıfları vb için güzel gerekmez enjeksiyon vardır

    +0

    Bu, muhtemelen en basit yoldur, çünkü kullanımdan kaldırılmış sınıfa doğrudan 1: 1 eşleme var. – Andrew

    +1

    'grails.util.Holders', 'grailsApplication' öğesinin enjekte edilmesine ne zaman tercih edilir? –

    +2

    @AlexanderSuraphel, yay kontrolünüzün besiyerinizin yaşam döngüsünü istemediğinizde. Örneğin, genel statik yöntemleri olan bir yardımcı program sınıfı. –

    4

    Sen grails yapılandırmasını erişebilir

    hizmetlerinde Kontrolörü

    class DemoController { 
        def grailsApplication 
    
        def demoAction = { 
         def obj = grailsApplication.config.propertyInConfig 
        } 
    } 
    
  • yılında

    1. : taglib olarak

      class DemoService { 
          def grailsApplication 
      
          def demoMethod = { 
           def obj = grailsApplication.config.propertyInConfig 
          } 
      } 
      
    2. :

      class DemoTaglib { 
          def grailsApplication 
      
          static namespace = "cd" 
      
          def demoMethod = { 
      
           def obj = grailsApplication.config.propertyInConfig 
      
           out << obj  
          } 
      } 
      

    Sen <cd:demoMethod/>

    olarak görünümünde taglib bu yöntemi çağırabilirsiniz
      görünümünde
    1. :

      <html> 
          <head><title>Demo</title></head> 
      <body> 
          ${grailsApplication.config.propertyInConfig} 
      </body> 
      
      </html> 
      
  • 0

    alanı sınıfından erişmek için yapmak:

    import grails.util.Holders 
    
    // more code 
    
    static void foo() { 
        def configOption = Holders.config.myProperty 
    }