2016-04-07 17 views
1

aşağıdaki kapsamları hakkında yazılır:Grails 3 Kontrolör Kapsam <a href="https://grails.github.io/grails-doc/latest/ref/Controllers/scope.html" rel="nofollow">Grails 3 documentation</a> baktığımızda

prototip (varsayılan) - Yeni bir kontrolör (Kapatma özellikleri olarak eylemler için önerilir) her istek

için oluşturulacak burada

garip kısmı Grails 3.1.4 anlamlı farklı sonuçlar açıkça devlet ben eğer elde ediyoruz:

static scope = "prototype" 

Tak örneğin e aşağıdaki UserController

class UserController { 
    def userService 
    List<String> users 

    def loadUsers() { 
     if (!users) { 
      println("########## have to load users"); 
      try { 
       user = userService.getAllUsersInAd() 
      } catch (Exception e) { 
       // do something 
      } 
     } else { 
      println("########## dont have to do it " + users.size()); 
     } 
    } 
} 

Ve statik kapsamı atlanırsa

class UserService { 
    def getAllUsersInAd() { 
     println("######### querying") 
     return new ArrayList<String>(); 
    } 
} 

, aşağıdaki UserService: Ben bir Firefox tarayıcıyı kapatmak ve yeniden açın zaman, "do not have

Ne kadar kaç kez kapattığımı/yeniden açtığımı göz önünde bulundurursun. Bu konuda daha da garip olan şey, Firefox'u kapattığımda tamamen farklı bir tarayıcıyı (krom gibi) açabileceğim ve aynı mesajın çalıştırılabileceğidir. Bu denetleyicinin kapsamı, JSF'nin @UygulamaScope'una benzer bir durumdur. İyi bir 5-10 dakika boşta kalma süresinden sonra, sorgu yeniden yürütülür, ancak senaryo kalır. Statik kapsam ifade edilirse

: beklendiği gibi her tarayıcı kapanış sonra

, yürütülen "kullanıcıları yüklemek zorunda".

Sorum şu, varsayılan kapsamın yanlış olduğu belgelendirmedir? Öyle değilse, açık bir şekilde kapsamı belirten "prototip" ve onu atlatma arasındaki fark nedir (yukarıdaki açıktan başka)?

cevap

3

böyle bir ayar göreceksiniz bir Grails 3.1.4 uygulaması için application.yml dosyayı oluşturdu. Bu ayar ayarlanmamışsa varsayılan kapsam prototype'dur.

+0

Yapılandırma ayarınız yukarıda açıklandığı gibi ise, denetleyicinizde "static scope = ..." yoksa, denetleyicileriniz 'singleton' olacaktır. Bu, denetleyicinizde "static scope = 'prototype'" olduğunda neden farklı davranışlar gördüğünüzü açıklar. –

1

Evet, bir süre önce denetleyicilerin varsayılan olarak singleton (application) kapsamına değiştirildiğine inanıyorum (sürüm 1.4.x olduğu gibi). Bunun belgelerini bulmaya çalışıyorum. Görünüşe göre JIRA sorunu düzeltildi, aslında here, ancak Grails JIRA'dan uzaklaştı ve tüm hataları GitHub'a taşımadı. Why does Grails recommend singleton scope for controllers with actions as methods? Bkz Burt'un cevap Jeff bile yorumlarınızda konuşur:

Zaten Grails ekibine göre kontrolörler devleti olmamalıdır.

DÜZENLEME: Jeff'in belirttiği gibi, varsayılan değer hala prototiptir, ancak varsayılan olarak oluşturulan yapılandırma bunların hepsini tekli olarak değiştirir; kontrolörleri singleton'ununu yapmak için çerçeve söyler

grails: 
    controllers: 
     defaultScope: singleton 

: Varsayılan olarak

+1

"Denetleyicilerin bir süre önce varsayılan olarak singleton (uygulama) kapsamına değiştirildiğini düşünüyorum" - Bu gerçekten doğru değil. Her şeyi değiştirdik, böylece varsayılan oluşturulan yapılandırma kapsamı singleton'a ayarlayacaktır, ancak gerçek varsayılan hala prototiptir. 3.1.4'de, https://github.com/grails/grails-core/blob/e402f3fa32f84c1b816e97db893158606517f89e/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java#L80 adresinde belirtilmiştir. –

+0

Teşekkürler Jeff. 2.x'in de singleton'a ayarlanmış farklı bir yapılandırması olduğunu varsayalım. – billjamesdev

+0

"2.x'in farklı bir yapılandırmasının da singleton'a ayarlandığını varsayalım." - Yapıyor. Her iki durumda da varsayılan 'prototip'tir ve yapılandırma ayarı bunu geçersiz kılar. –

İlgili konular