2009-05-18 23 views
5

Aşağıdaki örnekte, grails mail eklentisi tarafından sağlanan sendMail yönteminin kullanılması this book'da görünür.groovy closure parameters

sendMail { 
    to "[email protected]" 
    subject "Registration Complete" 
    body view:"/foo/bar", model:[user:new User()] 
} 

{} içindeki kodun, sendMail'e bir parametre olarak iletilen bir kapatma olduğunu anlıyorum. Ayrıca, to, subject ve body'un yöntem çağrıları olduğunu anlıyorum.

Sendmaili yöntemini uygulayan kod nasıl görüneceğini anlamaya çalışıyorum ve en iyi tahmin böyle bir şeydir:

MailService { 

    String subject 
    String recipient 
    String view 
    def model 

    sendMail(closure) { 
     closure.call() 
     // Code to send the mail now that all the 
     // various properties have been set 
    } 

    to(recipient) { 
     this.recipient = recipient 
    } 

    subject(subject) { 
     this.subject = subject; 
    } 

    body(view, model) { 
     this.view = view 
     this.model = model 
    } 
} 

bu makul mi, yoksa bir şey eksik? Özel olarak, kapıda (to, subject, body) başvurulan yöntemler, zorunlu olarak aynı sınıfın üyeleri olan sendMail?

sayesinde Don

cevap

1

Sana söz kitabı yok gibi sendmail'in yöntemi ne yaptığını tam olarak emin değilim. SendMail yöntemi, açıkladığınız gibi, gerçekten de bir kapatma işlemi gerçekleştirir ancak muhtemelen normal şekilde yürütülmek yerine builder kullanır. Esasen bu, gönderilecek bir e-postayı tanımlamak için bir Etki Alanı Özel Dili olacaktır.

Tanımladığınız sınıfın çalışmadığı nedeni, kapağın kapsamının, nerede çalıştırıldığının bildirilmediği yer olduğu yönündedir. Bu nedenle, kapatma işleminiz to() yöntemini çağırırsa, posta hizmetinin örneğini kapamaya aktarmadıkça, MailService yöntemine çağrı yapamazsınız.

Birkaç değişiklik yapılarak, örneğiniz normal bir kapatma işlemi kullanarak çalışabilir.

MailMessage sendMail(Closure callable) { 
    def messageBuilder = new MailMessageBuilder(this, mailSender) 
    callable.delegate = messageBuilder 
    callable.resolveStrategy = Closure.DELEGATE_FIRST 
    callable.call() 

    def message = messageBuilder.createMessage() 
    initMessage(message) 
    sendMail message 
    return message 
} 

ve örneğin yöntemi: sınıftaki Sendmail'de yöntem bu

def sendMail(closure) { 
    closure(this) 
    // Code to send the mail now that all the 
    // various properties have been set 
} 
7

MailService.sendMail kapatma devrederek gibi görünmelidir aşağıdaki çağrısına değişiklikler ve

// The it-> can be omitted but I put it in here so you can see the parameter 
service.sendMail {it-> 
    it.to "[email protected]" 
    it.subject "Registration Complete" 
    it.body view:"/foo/bar", model:[user:new User()] 
} 

MailMessageBuilder:

void to(recip) { 
    if(recip) { 
     if (ConfigurationHolder.config.grails.mail.overrideAddress) 
      recip = ConfigurationHolder.config.grails.mail.overrideAddress 
     getMessage().setTo([recip.toString()] as String[]) 
    } 
}