【问题标题】:how plugin works with inject and object instead of class in play 2.4插件如何在 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)
}
}

【问题讨论】:

    标签: scala playframework playframework-2.4


    【解决方案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 类将是我最后的手段,因为要更新的引用太多
    • 你可以使用包装器,但你必须使用包装器类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2015-09-15
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多