Я вижу, что класс Plugin теперь устарел (начиная с версии 2.4.x игры)... В документации API сказано, что вместо этого я должен использовать модули... так что это мой вопрос. Как написать модуль и как подключить этот модуль к жизненному циклу воспроизведения основного приложения?
Как подключиться к жизненному циклу игры с помощью модуля вместо плагина?
Ответы (1)
Вы не указываете, какой язык вы используете, поэтому я быстро расскажу об обоих. Я основываю оба ответа на следующих репозиториях:
Ява
Пишите свою функциональность так, как хотите — нет конкретных классов для расширения. Если у вас есть зависимости от компонентов Play, таких как
Configuration
, вы должны внедрить их.@Singleton public class MyModuleCode { private final boolean enableWidgets; @javax.inject.Inject public MyModuleCode(final Configuration configuration) { this.enableWidgets = configuration.getBoolean("widgets.enabled", false); } }
Обратите внимание, что внедрение зависимостей используется вместо статической ссылки. Также обратите внимание, что я дал этому примеру аннотацию @Singleton
, но также возможно иметь, например, область действия для каждого запроса.
Дополнительные сведения см. в документах Play DI.
Откройте компоненты вашего модуля. Для этого расширьте класс
play.api.inject.Module
и реализуйтеpublic Seq<Binding<?>> bindings(final Environment environment, final Configuration configuration)
.package com.example.module; public class MyModule extends Module { @Override public Seq<Binding<?>> bindings(final Environment environment, final Configuration configuration) { return seq(bind(MyModuleCode.class).toSelf().in(Singleton.class)); } }
Здесь вы также можете привязать реализации к интерфейсам, настроить поставщиков экземпляров и так далее.
Если вы публично выпускаете модуль, давайте предположим, что вы делаете это здесь — это выходит за рамки вопроса. Предположим также, что вы добавили зависимость для модуля в любом проекте, над которым работаете.
Включите модуль в
application.conf
.play { modules { enabled += com.example.module.MyModule } }
Компоненты, представленные через ваш модуль — в этом примере всего
MyModuleCode
— теперь доступны для внедрения в ваши контроллеры, действия и т. д.Если вам нужен хук выключения, просто введите
ApplicationLifecycle
в компонент и зарегистрируйте хук; см. https://playframework.com/documentation/2.4.x/JavaDependencyInjection#Stopping/cleaning-up для получения подробной информации.
Скала
Пишите свою функциональность так, как хотите — нет конкретных классов для расширения. Если у вас есть зависимости от компонентов Play, таких как
CacheApi
, вы должны внедрить их.@Singleton class DefaultPatternCache @Inject() (cache: CacheApi) extends PatternCache { override def apply(value: String): Option[Pattern] = cache.getOrElse[Option[Pattern]](key = s"Deadbolt.pattern.$value") { Some(Pattern.compile(value)) } }
Обратите внимание, что внедрение зависимостей используется вместо статической ссылки. Также обратите внимание, что я дал этому примеру аннотацию @Singleton
, но также возможно иметь, например, область действия для каждого запроса.
Дополнительную информацию см. в документах Play DI.
Откройте компоненты вашего модуля. Для этого расширьте класс
play.api.inject.Module
и реализуйтеdef bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]]
.package com.example.module import com.example.module.cache.{DefaultPatternCache, PatternCache} import play.api.inject.{Binding, Module} import play.api.{Configuration, Environment} class MyModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq(bind[PatternCache].to[DefaultPatternCache]) }
Здесь вы также можете привязать реализации к трейтам, настроить поставщиков экземпляров и так далее.
Если вы публично выпускаете модуль, давайте предположим, что вы делаете это здесь — это выходит за рамки вопроса. Предположим также, что вы добавили зависимость для модуля в любом проекте, над которым работаете.
Включите модуль в
application.conf
.play { modules { enabled += com.example.module.MyModule } }
Компоненты, представленные через ваш модуль — всего
MyModuleCode
в этом примере — теперь доступны для внедрения в ваши контроллеры, действия и т. д.Если вам нужен хук выключения, просто введите
ApplicationLifecycle
в компонент и зарегистрируйте хук; см. https://playframework.com/documentation/2.4.x/ScalaDependencyInjection#Stopping/cleaning-up для получения подробной информации.
Резюме
Модули больше не являются чем-то особенным — это просто способ группировки внедряемых компонентов.