2012-05-21 6 views
9

Tôi có một số dịch vụ triển khai một giao diện chung và tôi muốn có thể chọn một trong số các dịch vụ đó để đưa vào các dịch vụ khác khi ứng dụng của tôi khởi động.Cách chọn triển khai dịch vụ trong ứng dụng Grails?

Tôi đã thử tham khảo triển khai dịch vụ từ resources.groovy như được hiển thị bên dưới nhưng sau đó Spring tạo một phiên bản mới của dịch vụ đã chọn và không tự động phụ thuộc vào các dịch vụ được chọn của nó.

Làm cách nào để giải pháp này hoạt động? Hoặc là có một cách khác?

class MyService { 

    Repository repository 

    interface Repository { 
     void save(...) 
    } 
} 

class MySqlRepositoryService implements MyService.Repository { ... } 

class FileRepositoryService implements MyService.Repository { ... } 

resources.groovy:

beans = { 
    ... 
    repository(FileRepositoryService) { } 
} 

Trả lời

3

Đó là tất nhiên có thể lấy tài liệu tham khảo để phục vụ từ nhà máy tay xây dựng, nhưng theo ý kiến ​​của tôi, cách tiếp cận bạn đã thực hiện là tốt nhất. Tôi sử dụng nó bản thân mình, bởi vì nó tập hợp tất cả các thông tin về giai đoạn cấu hình của ứng dụng ở một nơi, vì vậy nó dễ dàng hơn để theo dõi thực hiện được sử dụng.

Cạm bẫy với autowiring mà bạn đã gặp phải có thể được giải thích rất dễ dàng. Tất cả các lớp được đặt trong grails-app/services được tự động định cấu hình bởi Grails dưới dạng hạt đơn Spring có tên autowiring. Vì vậy, định nghĩa bean bạn đã đặt trong grails-app/conf/resources.groovy tạo ra một bean khác, nhưng không có các giá trị mặc định được áp đặt bởi các quy ước Grails.

Giải pháp đơn giản nhất là đặt việc thực hiện trong src/groovy để tránh trùng lặp của đậu và sử dụng cú pháp sau để bật autowiring:

beans = { 
    repository(FileRepositoryService) { bean -> 
    bean.autowire = 'byName' 
    } 
} 
+0

Vì vậy, về cơ bản các kho của tôi sẽ đậu mùa xuân bình thường và không dịch vụ Grails . Điều đó sẽ làm việc độc đáo. Cảm ơn! –