2010-05-11 26 views
5

tôi cần phải tiêm một dịch vụ dựa trên sở hữu tên miền, cho đến nay tôi đã đưa ra như sau:Grails: Tự động bơm phục vụ trong lớp miền

ApplicationHolder.application.getServiceClass("package.${property}Service").clazz 

nhưng tải nó theo cách này không tiêm nó dịch vụ phụ thuộc . Tôi có làm sai không?

Trả lời

15

Các phiên bản mới sẽ bỏ qua việc quản lý sự phụ thuộc của Spring; bạn cần lấy bean đơn được cấu hình từ ngữ cảnh ứng dụng. Sử dụng điều này thay vì:

def service = ApplicationHolder.application.getMainContext().getBean("${property}Service") 

Đó là giả định rằng 'sở hữu' là tên đậu một phần cho một dịch vụ, ví dụ: cho FooBarService, bất động sản sẽ phải 'foobar'. Nếu đó là 'foobar' sau đó bạn có thể sử dụng GrailsNameUtils.getPropertyName() để sửa chữa nó: lớp miền

import grails.util.GrailsNameUtils 

String beanName = GrailsNameUtils.getPropertyName(property) + 'Service' 
def service = ApplicationHolder.application.getMainContext().getBean(beanName) 
+0

Yay, nó hoạt động. Tôi đã thử phương thức getBean, nhưng đã chuyển 'FooBar' sang nó :) – rukoche

+0

Ở trên không làm việc cho tôi cho đến khi tôi thay thế '.getMainContext.' bằng' .getMainContext(). ' – sebnukem

+0

Cảm ơn, tôi đã sửa nó sau khi thấy rằng chỉnh sửa đã bị từ chối không chính xác –

0

Có. Các dịch vụ không được tiêm vào các đối tượng miền. Nếu đối tượng miền của bạn cần một cái gì đó cho một trường hợp sử dụng cụ thể, hãy để cho dịch vụ sở hữu trường hợp sử dụng đó gọi dịch vụ khác thay mặt cho đối tượng miền.

+2

Bất kỳ bean mùa xuân nào cũng có thể được chèn vào các lớp miền giống như trong bộ điều khiển, tức là "def fooService". Trường hợp sử dụng phổ biến cho việc này là gọi một dịch vụ trong trình xác thực tùy chỉnh. –

+0

Có thể; Tôi chỉ không đồng ý rằng nó nên được. Trình xác thực khác với đối tượng miền như Tài khoản hoặc Cá nhân. Đó là một trường hợp sử dụng hoàn toàn khác. – duffymo

3

IMHO không nên chứa logic chút nào (ngoài hình thành xác nhận).

Trong các dự án của tôi, tôi thường tạo ra một dịch vụ cho mỗi lớp miền (ví dụ UserService cho lớp tài) và tôi dính vào tất cả các logic trong đó, thậm chí bit nhỏ trong mảnh mà thông thường sẽ có trong lớp miền.

Tôi nghĩ rằng rất nhiều lập trình viên đến từ thế giới Java/C++ có xu hướng tìm thấy điều này xấu xí, nhưng nó phù hợp hơn với kiến ​​trúc Grails.

+3

Đúng là các lớp miền Grails không thực sự phù hợp với logic, nhưng đây là một sự xấu hổ vì tôi phải đồng ý với Fowler về điều này: http://en.wikipedia.org/wiki/Anemic_Domain_Model – Kimble

+1

Thật vậy , Eric Evans có lẽ cảm thấy một sự xáo trộn trong lực lượng, khi ai đó nói rằng "các lớp miền không nên chứa logic ở tất cả". Đó là âm thanh giống như một đối tượng Domain anti-pattern và hoàn toàn chống lại Domain-driven Design. –

+0

Trong trường hợp của tôi, tôi muốn thiết lập một chỉ số TTL dựa trên môi trường grails. Mô hình tốt hơn cho điều này là gì? – Kirby

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