让我忍不住跳出来新开一帖讨论(观点不一定正确,还是尝试中),
我是同意buuawhl的,不过可能出发点不一样。
buuawhl 写道
组合子不错,不过用错了地方。
SQL拼装采用组合子(比如包括Hibernate Criteria)这种思路,完全是画蛇添足,一无是处,成事不足,败事有余。
我是倾向于DDD中提出的selection的Specification的手段。
我们工作的目标是什么:selection的查询逻辑。
换句话说我们是组合查询逻辑的。不过是因为repository是数据库类型,因而内部需要组合sql语句。
那么组合的对象应该是更高一层抽象的specification,而不是sql的对象化形式expression,
而这样做两个好处是:
第一,解决了dao的在设计分层中的尴尬地位。典型的分层体系如appfuse,
查询本身是一种逻辑,而dao独立层次的存在把不同的查询logic来了个大集中,这样的用法就很尴尬。
而如springside则好些,虽然把dao作为service来用,但是criteria的组装独立于dao之外。
而DDD提出的Specification,就很好的解决的这一分层问题。
第二,提供了一定的函数式编程能力(组合子编程), 提供三种简单的操作and, or和not.
我以为DDD在这里不考虑去组合基本的Expression,
而是从业务角度考虑,组合的是specification,返回的是domain object list(这样更是显示的和sql中的projection区别开)
当然这样的组合能力可能不强,不过基本可用(本句话未经验证,还没有来得及做)。
至于内部即便是用sql也是可以的,如果觉得被"污染"了(buuawhl老大语录),就参考ibatis的思路做。
安徽新华电脑学校专业职业规划师为你提供更多帮助【在线咨询】