2012-05-17 25 views
12

Tôi muốn tiêm dịch vụ của mình trong lớp Groovy/src. Các dependency injection normaln không hoạt động:Grails 2.x tiêm dịch vụ trong Groovy/src

... 
def myService 
... 

Tôi có thể sử dụng điều này (nó hoạt động):

def appCtx = ApplicationHolder.application.getMainContext() 
def myService = appCtx.getBean("myService"); 

nhưng ApplicationHolder bị phản đối. Có giải pháp nào tốt hơn không?

Thanks cho bất kỳ gợi ý

+0

Bạn sử dụng lớp 'src này' như thế nào? Ở đâu và làm thế nào bạn nhanh chóng nó? –

+0

Tôi sử dụng nó bên trong các lớp Groovy khác (nó được khởi tạo ở đó). Có một lớp groovy mặt tiền được sử dụng bởi một dịch vụ nào kích hoạt tất cả các thủ tục đó. Tôi không muốn chuyển dịch vụ đã sử dụng làm thông số để không vượt quá nhiều tham số ... – kuceram

Trả lời

12

Kiểm tra sau Grails FAQ để truy cập vào bối cảnh ứng dụng từ các nguồn trong src/groovy - http://grails.org/FAQ#Q: Làm cách nào để truy cập vào ngữ cảnh ứng dụng từ các nguồn trong src/groovy?

Không có lớp ApplicationContextHolder tương đương với ApplicationHolder. Để truy cập vào một lớp dịch vụ gọi là EmailService từ một lớp Groovy trong src/groovy, truy cập vào đậu mùa xuân sử dụng:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA 
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT) 
def emailService = ctx.emailService 
+1

Trong khi điều này sẽ cho phép bạn truy cập các phương thức trong một dịch vụ, nó sẽ phá vỡ giao dịch dịch vụ. Trích từ [Giao dịch khai báo] (http://grails.org/doc/latest/guide/services.html#declarativeTransactions): *** Cảnh báo: tiêm phụ thuộc là cách duy nhất mà các giao dịch khai báo hoạt động. Bạn sẽ không nhận được dịch vụ giao dịch nếu bạn sử dụng toán tử mới như BookService mới() *** – ubiquibacon

+3

@ubiquibacon - có nhưng "def emailService = ctx.emailService" sẽ là dịch vụ giao dịch.Tôi xin lỗi nhưng vấn đề với dịch vụ truy cập như thế này là gì? – Saurabh

+0

Tôi không nghĩ rằng đó đủ điều kiện là "tiêm phụ thuộc". Tôi sẽ phải làm một số thử nghiệm để xác minh rằng mặc dù. – ubiquibacon

2

Bạn có thể dễ dàng đăng ký mới (hoặc ghi đè lên hiện có) đậu bằng cách cấu hình chúng trong grails-app/conf/spring/resources.groovy:

// src/groovy/com/example/MyClass.groovy 
class MyClass { 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) { 
     myService = ref('myService') 
    } 
} 

Ngoài ra bạn có thể kiểm tra câu hỏi này về How to access Grails configuration in Grails 2.0?

+0

Bây giờ tôi thấy rằng điều này không hiệu quả đối với tôi. Tôi không thể ràng buộc một dịch vụ hoặc các tài sản khác trong resources.groovy như thế này: ' nhập khẩu com.path.to.ResidentAtPlace đậu = { residentAtPlaceBean (ResidentAtPlace) { \t \t someProperty = 45 placeService = ref ('placeService') \t \t grailsApplication = ref ('grailsApplication') }} ' Everything is null trong ResidentAtPlace.groovy tôi bạn có thấy bất kỳ vấn đề? Tôi đang sử dụng Grail 2.0.3 – kuceram

+0

điều tương tự xảy ra với tôi, bất kỳ ý tưởng nào tại sao? – mathifonseca

28

Việc thay ApplicationHolder có thể Holders, bạn cũng có thể sử dụng nó trong phạm vi tĩnh:

import grails.util.Holders 
... 

def myService = Holders.grailsApplication.mainContext.getBean 'myService' 
+0

cũng hoạt động ở Grails 3.0! – boraas

2

Yo có thể làm điều đó từ resources.groovy:

// src/groovy/com/example/MyClass.groovy 
class MyClass { 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) { 
     myService = ref('myService') 
    } 
} 

hoặc chỉ sử dụng anotation autowired:

// src/groovy/com/example/MyClass.groovy 

import org.springframework.beans.factory.annotation.Autowired 

class MyClass { 
    @Autowired 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) {} 
} 
Các vấn đề liên quan