2009-05-18 7 views
5

grails मेल प्लगइन द्वारा प्रदान की गई SendMail विधि का उपयोग करने का निम्नलिखित उदाहरण this book में दिखाई देता है।ग्रोवी क्लोजर पैरामीटर

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

मैं समझता हूँ कि भीतर कोड {} को बंद करने कि एक पैरामीटर के रूप sendmail को पारित कर दिया जाता है। मैं यह भी समझता हूं कि to, subject और body विधि कॉल हैं।

मैं यह पता लगाने की क्या कोड है कि sendmail विधि को लागू करता है की तरह लग रहे हैं कोशिश कर रहा हूँ, और मेरे सर्वोत्तम अनुमान कुछ इस तरह है:

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 
    } 
} 

इस उचित है, या मैं कुछ याद आ रही है? विशेष रूप से, बंद होने के साथ लागू विधियों (to, subject, body), आवश्यक रूप से उसी वर्ग के सदस्य sendMail के रूप में हैं?

धन्यवाद, डॉन

उत्तर

1

मुझे यकीन है कि के रूप में मैं किताब आप का उल्लेख नहीं है कि वास्तव में क्या sendmail विधि करता नहीं हूँ। प्रेषण विधि वास्तव में आपके द्वारा वर्णन किए जाने पर बंद हो जाती है लेकिन यह संभवतः सामान्य तरीके से निष्पादित होने के बजाय builder का उपयोग करती है। एक ईमेल का वर्णन करने के लिए अनिवार्य रूप से एक डोमेन विशिष्ट भाषा होगी।

आपके द्वारा परिभाषित कक्षा का काम नहीं करने का कारण यह है कि बंद होने का दायरा वह जगह है जहां यह घोषित नहीं किया जाता है कि यह कहां चलाया जाता है। इसलिए अपना बंद करने के लिए() विधि को कॉल करें, यह मेल सेवा में विधि को कॉल करने में सक्षम नहीं होगा जब तक आप बंद करने में मेल सेवा का उदाहरण पास नहीं करते।

कुछ संशोधनों के साथ, आपका उदाहरण नियमित बंद होने के बावजूद काम कर सकता है। कॉल में निम्न परिवर्तन और

// 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()] 
} 

कक्षा में sendmail विधि इस

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

MailService.sendMail बंद delegating तरह दिखना चाहिए:

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 
} 

और उदाहरण के लिए, विधि MailMessageBuilder पर:

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