Как правильно внедрить сервис в классный класс? - PullRequest
3 голосов
/ 24 марта 2011

Я использую Grails 1.2.1. В моем файле src / groovy есть класс, в который я хотел бы добавить ссылку на сервис. Итак, у меня есть ...

def utilityService

public HttpTransporter(URI uri, HttpServletResponse response) { 
    this.uri = uri;
    this.response = response;
    def ctx = ApplicationHolder.getApplication().getMainContext();
    utilityService = ctx.getBean("utilityService");
}   // HttpTransporter

Но это выглядит очень анти-Groovy / Grails. Кроме того, мне не нравится создавать новый экземпляр службы при каждом создании экземпляра класса. Есть идеи как это оптимизировать?

Спасибо, - Дейв

1 Ответ

5 голосов
/ 24 марта 2011

Вы не создаете новый экземпляр службы при вызове getBean (), просто получаете ссылку на синглтон. Если бин был бином-прототипом, вы бы получили новые экземпляры, но сервисы Grails - не одиночные.

Это не очень «круто», но вы получаете доступ к бинам Spring за пределами артефакта, поэтому вам нужно либо извлекать бины из контекста приложения, как вы делаете, либо передавать бины при вызове HttpTransporter. В идеале вы могли бы переделать свой вызывающий код, чтобы вы указали зависимости, а не извлекали их:

HttpTransporter(URI uri, HttpServletResponse response, utilityService) { 
   this.uri = uri
   this.response = response
   this.utilityService = utilityService
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...