Tapestry5 с использованием услуг внутри расширенных классов.

Я пользователь tapestry5 с вопросом об использовании услуг внутри расширенных классов. Допустим, у меня есть следующая структура класса,

BaseClass

public class BaseClassImpl extends ExtendedOneClass implements BaseClass {

   @Inject
   private ServiceOne serviceOne;
}

ExtendedOneClass

public class ExtendedOneClass extends ExtendedTwoClass {

   @Inject
   private ServiceTwo serviceTwo;
}

ExtendedTwoClass

public class ExtendedTwoClas {

   @Inject
   private ServiceThree serviceThree;
}

Что мне нужно сделать, чтобы иметь возможность пользоваться услугами внутри расширенного класса?

Я настраиваю свой AppModule так

public static void bind(ServiceBinder binder) {
    binder.bind(BaseClass.class, BaseClassImpl.class);
    binder.bind(ExtendedOneClass.class);
    binder.bind(ExtendedTwoClass.class);
}

Но я не могу заставить службы работать внутри расширенного класса. Я предполагаю, что это потому, что расширенный класс не был создан с помощью @Inject гобелена. Итак, вопрос в том, как вы решаете эту задачу?

1 ответ

Используйте внедрение конструктора и передайте сервисы родительскому конструктору:

public class BaseClassImpl extends ExtendedOneClass implements BaseClass
{
   private HibernateSessionSource hibernateSessionSource;

   public BaseClassImpl(SystemEnvironment systemEnvironment, LinkSource linkSource, 
                        HibernateSessionSource hibernateSessionSource)
   {
       super(systemEnvironment, linkSource);
   }
}

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

binder.bind(ExtendedOneClass.class).withId("ext1");

В сочетании с этим:

@InjectService("ext1")
private ExtendedOneClass extendedOneClass;
Другие вопросы по тегам