2012-12-19 30 views
10

Từ bộ điều khiển của tôi, tôi muốn tự động chọn dịch vụ dựa trên thông số.Cách tự động chọn dịch vụ trong Grails

Hiện nay tôi có một dịch vụ cơ bản và một số dịch vụ khác mà mức độ dịch vụ cơ sở này. Dựa trên các thông số tôi gọi một lớp học mà không tạo ra một tên đậu dựa trên param và cuối cùng gọi như sau:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA 

class Resolver { 
    def ctx 

def getBean(String beanName) { 
    if(!ctx) { 
     ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT) 
    } 
    return ctx."${beanName}" 
} 

}

này trả về dịch vụ tôi muốn. Tuy nhiên tôi cảm thấy khá bẩn làm theo cách này. Có ai có một cách tốt hơn để xử lý nhận được một dịch vụ (hoặc bất kỳ đậu khác) dựa trên một số tham số?

Cảm ơn bạn.

Trả lời

13

ctx."${beanName}" được thêm vào số ApplicationContext metaclass để bạn có thể thực hiện các công cụ như def userService = ctx.userService. Nó chỉ là một phím tắt cho ctx.getBean('userService') vì vậy bạn có thể thay đổi mã của bạn để

return ctx.getBean(beanName) 

và nó sẽ là như nhau, nhưng ít huyền diệu.

Vì bạn đang gọi điện thoại này từ một bộ điều khiển hay một dịch vụ, tôi muốn bỏ qua những thứ ServletContextHolder và lấy bối cảnh của sự phụ thuộc-cách tiêm các grailsApplication đậu (def grailsApplication) và nhận được nó qua def ctx = grailsApplication.mainContext. Sau đó vượt qua nó vào lớp helper này (nhớ mô lớn của mùa xuân là dependency injection, không cũ-trường phụ thuộc-kéo) và sau đó nó sẽ chỉ đơn giản là

class Resolver { 
    def getBean(ctx, String beanName) { 
     ctx.getBean(beanName) 
    } 
} 

Nhưng sau đó nó đơn giản như vậy mà tôi sẽ không bận tâm với lớp trợ giúp ở tất cả :)

Các vấn đề liên quan