Я должен ввести сервис на основе доменного свойства, до сих пор я придумал следующее:
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
но загружая его, который не вводит этот путь, он - зависимые сервисы. Я делаю его неправильно?
Новые экземпляры будут обходить Spring управление зависимостями; вам необходимо получить настроенный одноэлементный компонент из контекста приложения. Используйте вместо этого:
def service = ApplicationHolder.application.getMainContext().getBean("${property}Service")
Предполагается, что «свойство» - это частичное имя bean-компонента для службы, то есть для FooBarService свойство должно быть «fooBar». Если это «FooBar», то вы можете использовать GrailsNameUtils.getPropertyName (), чтобы исправить это:
import grails.util.GrailsNameUtils
String beanName = GrailsNameUtils.getPropertyName(property) + 'Service'
def service = ApplicationHolder.application.getMainContext().getBean(beanName)
Да. Сервисы не внедряются в объекты домена. Если вашему объекту домена нужно что-то для определенного варианта использования, позвольте службе, которой принадлежит этот вариант использования, вызывать другую службу от имени объекта домена.
IMHO доменные классы вообще не должны содержать логику (кроме валидаторов).
В своих проектах я обычно создаю сервис для каждого доменного класса (например, UserService для класса User) и вставляю туда всю логику, даже небольшие кусочки, которые обычно находятся в доменном классе.
Я думаю, что многие программисты, пришедшие из мира Java/C++, сочтут это уродливым, но это лучше подходит для архитектуры Grails.