【问题标题】:Dependency injected controllers in Play with @Play with @ 中的依赖注入控制器
【发布时间】:2015-08-25 18:26:28
【问题描述】:

这不是阻塞问题,但我想了解 Play 如何更好地处理控制器注入。

Play document about Routing in 2.4,据说:

Play 支持生成两种类型的路由器,一种是依赖注入路由器,另一种是静态路由器。默认是静态路由器,但如果您使用 Play 种子激活器模板创建了一个新的 Play 应用程序,您的项目将在 build.sbt 中包含以下配置,告诉它使用注入的路由器:

routesGenerator := InjectedRoutesGenerator

Play 文档中的代码示例假定您使用的是注入路由生成器。如果您不使用它,您可以轻松地调整静态路由生成器的代码示例,方法是在路由的控制器调用部分前加上 @ 符号,或者将每个控制器声明为对象而不是类。

所以,据我了解,在build.sbt 中使用routesGenerator := InjectedRoutesGenerator,如果我在控制器调用中使用@ 前缀,则与将控制器设置为单例object 相同。这与我一直将我的控制器声明为 class 并具有一些注入(使用 @Inject)的事实背道而驰,并且我在所有控制器调用前加上 @,这样 IntelliJ 就不会报告错误。

那么,@ 真正对我的控制器调用做了什么?

【问题讨论】:

    标签: scala intellij-idea dependency-injection playframework-2.4


    【解决方案1】:

    @StaticRoutesGenerator 的一个选项,与Injected 无关。

    当您按照推荐的方式使用InjectedRoutesGenerator 时,您的控制器必须是一个类,其中将注入依赖项(如果您使用运行时 DI,则自动注入,如果使用编译时,则手动注入DI)。在路由文件中,你只需要引用没有@的类。

    如果您选择StaticRoutesGenerator,路由器将遵循与 Play 2.3 及更低版本相同的行为。控制器默认为对象,您可以添加@ 来引用类。

    我希望这可以解决您的疑虑。

    【讨论】:

    • 到目前为止,我所拥有的是我的控制器作为类,带有注入的组件。我还在 build.sbt 中启用了 InjectedRoutesGenerator。在我的路由文件中,我有 @ 前缀。当我认为它应该打破时,这仍然有效。所以我想知道在我当前的设置中,如果我的控制器被注入了。
    • 你删除@是什么?我认为它们只是被 InjectedRoutesGenerators 忽略了。而且很容易知道您的控制器是否被注入,只需尝试使用路由调用它们即可。如果有效,它们就会被注入。
    • 你是什么意思“你删除@是什么?”
    • 使用routes.Application.index中的路由调用控制器?
    • 既然您提到了调用控制器,我确实进行了一些测试,我使用应用程序实例来创建注入控制器。我认为这意味着我的控制器是注入的而不是静态的。
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多