加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

设计模式 – 服务层方法应该期望实例还是id?

发布时间:2020-12-14 22:31:33 所属栏目:资源 来源:网络整理
导读:这个问题源自我在Grails应用程序上的工作,但它适用于几乎所有在层中开发的Web应用程序.这是一个简单的例子: class OrderService { // Option 1 def shipOrder(Order order) { order.status = OrderStatus.SHIPPED emailService.sendShipmentEmail(order) //
这个问题源自我在Grails应用程序上的工作,但它适用于几乎所有在层中开发的Web应用程序.这是一个简单的例子:
class OrderService {

    // Option 1
    def shipOrder(Order order) {
        order.status = OrderStatus.SHIPPED
        emailService.sendShipmentEmail(order)
        // ...
    }

    // Option 2
    def shipOrder(long orderId) {
        def order = Order.get(orderId)
        order.status = OrderStatus.SHIPPED
        emailService.sendShipmentEmail(order)
        // ...
    }

}

这些选项中的任何一个都记录为比另一个更好吗?

解决方法

我倾向于选择id,因为你有时想要使用悲观锁定,然后很容易将Order.get(orderId)更改为Order.lock(orderId).锁定必须在事务中发生,因此使用您在读取后锁定的第一种方法,在中间运行较小的更新风险.

有时需要在服务之外加载实例,例如测试控制器中是否存在,所以第二种方法可以感觉它浪费了数据库调用.但是您可以将get()调用更改为exists()调用并仅检查是否存在id,而不是仅仅为了查看它是否存在而加载整个实例.

请注意,您应该在方法签名中使用long orderId,因为允许null id没有意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读