Grails: Динамично введите сервис в доменном классе

Я должен ввести сервис на основе доменного свойства, до сих пор я придумал следующее:

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

но загружая его, который не вводит этот путь, он - зависимые сервисы. Я делаю его неправильно?

5
задан rukoche 11 May 2010 в 20:18
поделиться

3 ответа

Новые экземпляры будут обходить 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)
15
ответ дан 18 December 2019 в 09:05
поделиться

Да. Сервисы не внедряются в объекты домена. Если вашему объекту домена нужно что-то для определенного варианта использования, позвольте службе, которой принадлежит этот вариант использования, вызывать другую службу от имени объекта домена.

0
ответ дан 18 December 2019 в 09:05
поделиться

IMHO доменные классы вообще не должны содержать логику (кроме валидаторов).

В своих проектах я обычно создаю сервис для каждого доменного класса (например, UserService для класса User) и вставляю туда всю логику, даже небольшие кусочки, которые обычно находятся в доменном классе.

Я думаю, что многие программисты, пришедшие из мира Java/C++, сочтут это уродливым, но это лучше подходит для архитектуры Grails.

3
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: