2014-09-07 3 views
1

Краткая версия: как внедрить объект внутри Action в Play Framework?Play Framework: Инъекция зависимостей внутри действия

Длинная версия: В моем проекте у меня есть пользовательское действие аннотации @AuthenticationRequired, которое загружает объект из базы данных User и помещает его в context.args. Он использует класс DAO, который реализует UserDAO. Теперь я хочу использовать DAO класс, введенный в Action Google Guice. Я могу использовать Guice и вводить экземпляры в контроллеры и тесты, но мне трудно вводить DAO-класс внутри Action.

Инжектор - это поле на GlobalSettings экземпляр.

Я попытался переопределить GlobalSettings#onRequest() и поместить экземпляр UserDAO в context.args, а затем извлечь его изнутри AuthenticationRequired действия, но оказывается, что действия, возвращенное GlobalSettings#onRequest() называют последним в цепочке действий, используемых с @With и/или пользовательских аннотаций , поэтому, это поздно.

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

Любые идеи, как я могу это достичь?

ответ

0

Вы можете достичь этого так же, как с контроллерами - описывают свои действия, как (боб в моем случае - я использую Spring IoC) зависимость и получить его называют

public <A> A getControllerInstance(Class<A> clazz) 

из Application Global object. Это все, что вам нужно - ваши зависимости будут введены. BTW. Действия должны создаваться с каждым экземпляром, поэтому в моем случае я должен использовать область «прототип». Помните об этом, используя Guice - он должен иметь аналогичную функциональность.

+0

ли вы имеете в виду, что если я определить действие как свойство моего контроллера (+ аннотирования его с '@ Inject' и передать его как параметр для конструктора), то тот же экземпляр будет использоваться как действие контроллера? –

+0

Я имел в виду, что если вы аннотируете свой контроллер аннотацией к действию, как [здесь] (https://playframework.com/documentation/2.4.x/JavaActionsComposition#Annotating-controllers), то ваше действие будет создаваться с помощью контейнера DI (и это зависимостей) непосредственно перед вашим контроллером. DI Container будет вводить зависимости вашего действия, и вы сможете использовать их в своем коде действий –

2

Для игры 2.5 вы можете просто добавить @Inject поверх конструктора класса Action и ввести все необходимое. Вот отрывок из моего рабочего проекта (я использую Guice, как DI):

public class ChannelPermissionAction extends Action<ChannelPermission> { 

    private final AuthorizationService authorizationService; 
    private final AsyncHelper asyncHelper; 

    @Inject 
    public ChannelPermissionAction(AuthorizationService authorizationService, AsyncHelper asyncHelper) { 
    this.authorizationService = authorizationService; 
    this.asyncHelper = asyncHelper; 
    } 
    ... 
} 
Смежные вопросы