2

我正在尝试使用 Slick and Play 在 Scala 中创建通用数据库插入方法!构架。这涉及传入一个通用的 Form 实例和与之关联的模型对象。目前我遇到了两个让我发疯的问题:

  1. 如何实例化泛型类型?
  2. 如何从泛型表单绑定动态生成该泛型类型的参数?

到目前为止的代码

/**
  * Template method for accessing a database that abstracts out
  * Database.forDataSource(DB.getDataSource()) withSession {}
  * and actual form vals; will allow for anonymous Form declarations.
  */ 
  def dbAccessThatUsesAForm[I <: AnyRef, T <: Table[I]](
    f: Form[Product], // a Form of some generic tuple or mapping
    t: T,             // a Slick table to insert I objects into
    i: Class[I]       // the actual class that I belongs to (maybe not needed)
  )(
    request: SecuredRequest[AnyContent] // this is a SecureSocial auth. thing
  ): Boolean = {

  f.bindFromRequest((request.request.body.asFormUrlEncoded).getOrElse(Map())).fold(
    errors => {
      logger.error(t.toString + "was not bound to " + t.toString + "'s Form correctly")
      false
    },
    success => {
      t.insert(new I(someParamsThatIHaveNoIdeaWhereToStart)) // DOES NOT WORK
      true
    }
  )
}

在一个

type not found: I

在这一点上,我认为我深深误解了 Scala 泛型并考虑使用依赖注入作为解决方案。也许传入一个将类绑定到此方法的函数,并在我的方法中调用它?但是我已经在这篇文章之后Injector定义了......这里的依赖注入是基于一个模块......但是这里的注入不是基于我是在生产中还是在测试中......Global.scala

在两个

Play Forms可以将元组用于其字段映射。所以我尝试查找如何描述通用元组类型。因此,我推测我将传入Form[Product](API for ProductForm ) 而不是Form[_],并执行以下操作:

(for循环中的东西不起作用,因为productArity 它实际上不是映射的一部分

for( i = 1 to f.mapping.productArity ) { // pretty sure this won't work. 
  // generate the parameters and store them to some val by calling smth like
  val store Params += success.productElem(i) 
}

正如你所看到的,我很迷茫

  • 如何获取表单中的字段数,因为表单实际上由Seq[Mapping]

  • 我到底如何存储动态生成的参数

构造函数是否将参数作为元组接收?是否有一种 Parameter 对象可以传递给通用类实例化器?

4

0 回答 0