当前位置

网站首页> 程序设计 > 程序资讯 > 软件更新资讯 > 浏览文章

Form-binder v0.9.0 发布,微型数据绑定

作者:小梦 来源: 网络 时间: 2024-05-18 阅读:

4月18日 武汉 源创会开始报名,送华为开发板

Form-binder v0.9.0 发布了。主要是改动了 `FormBinder.bind` 的方法签名。

这一改动会对普通用户的使用方式造成一些影响:

原来的应用代码是这样的

import com.github.tminglei.bind.simple._val binder = expandJsonString("body", Some("json")) >-: FormBinder(messages)val mappings = tmapping(  "id" -> long(),  "json" -> tmapping(    "email" -> required() >+: text(email()),    "price" -> (cleanPrefix("$") >-: float()),    "count" -> number().verifying(min(3), max(10))  ).label("xx").verifying { case (label, (email, price, count), messages) =>    if (price * count > 1000) {  	 Seq("" -> s"$label: $price * $count = ${price * count}, too much")    } else Nil  })val data = Map(  "id" -> "133",  "body" -> """{"email":"test@example.com", "price":"$137.5", "count":5}""")binder.bind(mappings, data) { case (id, (email, price, count)) =>  //do something here ...}

现在会变成这样

import com.github.tminglei.bind.simple._val binder = expandJsonString("body", Some("json")) >-: FormBinder(messages)val mappings = tmapping(  "id" -> long(),  "json" -> tmapping(    "email" -> required() >+: text(email()),    "price" -> (cleanPrefix("$") >-: float()),    "count" -> number().verifying(min(3), max(10))  ).label("xx").verifying { case (label, (email, price, count), messages) =>    if (price * count > 1000) {  	 Seq("" -> s"$label: $price * $count = ${price * count}, too much")    } else Nil  })val data = Map(  "id" -> "133",  "body" -> """{"email":"test@example.com", "price":"$137.5", "count":5}""")binder.bind(mappings, data).fold(  errors => errors,  { case (id, (email, price, count)) =>    //do something here ...  })

注:在 bind 以后的使用代码需要做些调整。

----------------------------------------------

原来的接口是可以处理 errors 的,通过 ErrProcessor,但新的接口无疑更灵活些;可以通过配置 ErrProcessor 统一做些预处理,真正绑定后在具体运行环境中再做最终处理。

另外,我正在把 form-binder 和 Scalatra 的集成文档添加进 Scalatra Guide,如果顺利,不久就可以在 Scalatra 官网的文档里见到它了。

form-binder 是一个容易使用和定制的微型数据绑定和校验框架。

它有如下特点:

  • 非常轻量,总共才 700 多行代码(框架 + 内置扩展)

  • 容易使用,使用过程没有冗余代码,所见及所得

  • 高度可定制,你可以扩展几乎每一个执行点

  • 容易扩展,每个扩展接口都只是一个 FunctionN 的别名

  • 不可变性,让你可以安全的共享/(嵌套)复用 mapping定义对象