插件如何在 play 2.4 中使用注入和对象而不是类

Posted

技术标签:

【中文标题】插件如何在 play 2.4 中使用注入和对象而不是类【英文标题】:how plugin works with inject and object instead of class in play 2.4 【发布时间】:2015-07-03 04:34:28 【问题描述】:

我需要为 play 2.4 迁移 play mailer 插件。我检查了 play 2.4 的一些示例,发现所有示例都使用插件类。我不想将其转换为类。有没有办法让它与 Object 一起工作?

样本

class MyComponent @Inject() (mailerClient: MailerClient) 
    def sendEmail 
       val email = Email(......)
       ......
       mailerClient.send(email)
    

原始代码

object MailHandler
  def sendEmail(to: String) = 
try 
  val email = play.api.libs.mailer.Email(...)
  MailerPlugin.send(email)
catch
  case ex:Exception=>PlayLogger.instance.error(ex.getMessage)


【问题讨论】:

【参考方案1】:

我假设您使用对象而不是类来使其成为单例。

有一个用于单例的特殊注释 (-> @Singleton),它确保只创建一个类的实例。

尽管他们仍然使用实际的类而不是对象。

一个例子可能如下所示:

import javax.inject._

@Singleton
class MailerClient 
  def sendEmail(to: String) = 
    try 
      val email = play.api.libs.mailer.Email(...)
       MailerPlugin.send(email)
    catch
      case ex:Exception=>PlayLogger.instance.error(ex.getMessage)
    
  

查看文档: https://www.playframework.com/documentation/2.4.x/ScalaDependencyInjection#Singletons

【讨论】:

我不仅想使用单例,还想使用静态类。Object 非常适合,我的项目中有很多对象。你的意思是我必须将所有对象转换为类? 您不必将每个对象都转换为一个类。只有那些你想作为单例注入的。您还可以为每个对象编写一个包装器,但看起来单例注释似乎是一个更好的解决方案。 有没有办法使用 Inject 并且仍然使用 scala 对象?我有很多需要使用单例的对象。将每个这样的 Object 更改为 Singleton Scala 类将是我最后的手段,因为要更新的引用太多 你可以使用包装器,但你必须使用包装器类。

以上是关于插件如何在 play 2.4 中使用注入和对象而不是类的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.4 - 依赖注入替换 GlobalSettings.onStart()

如何使用 Play 实现预定的一次性流程! v1.2.4 和 Heroku Scheduler 插件

Play Framework 2.4 全局对象迁移

在 Akka actor 中玩 2.4 依赖注入

Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException

Java Play 2.4 使用注入为类编写测试用例