Grails: динамически внедрить сервис в доменный класс - PullRequest
5 голосов
/ 12 мая 2010

Мне нужно внедрить сервис, основанный на свойстве домена, поэтому я пришел к следующему:

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

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

Ответы [ 3 ]

15 голосов
/ 12 мая 2010

Новые экземпляры будут обходить управление зависимостями Spring; вам нужно получить настроенный одноэлементный компонент из контекста приложения. Используйте это вместо:

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

Это предполагает, что 'property' - это частичное имя компонента для службы, то есть для FooBarService, свойство должно быть 'fooBar'. Если это «FooBar», то вы можете использовать GrailsNameUtils.getPropertyName (), чтобы исправить это:

import grails.util.GrailsNameUtils

String beanName = GrailsNameUtils.getPropertyName(property) + 'Service'
def service = ApplicationHolder.application.getMainContext().getBean(beanName)
3 голосов
/ 12 мая 2010

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

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

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

0 голосов
/ 12 мая 2010

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

...