我正在尝试使用 Slick and Play 在 Scala 中创建通用数据库插入方法!构架。这涉及传入一个通用的 Form 实例和与之关联的模型对象。目前我遇到了两个让我发疯的问题:
- 如何实例化泛型类型?
- 如何从泛型表单绑定动态生成该泛型类型的参数?
到目前为止的代码
/**
* 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 Product和Form ) 而不是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 对象可以传递给通用类实例化器?