gpt4 book ai didi

design-patterns - 服务层方法应该使用实例还是ID?

转载 作者:行者123 更新时间:2023-12-04 07:19:22 25 4
gpt4 key购买 nike

这个问题源于我在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)。锁定必须在事务中发生,因此使用第一种方法,即您在读取后将其锁定,这之间的更新风险很小。

有时有必要将实例加载到服务之外,例如在 Controller 中测试是否存在,因此第二种方法可能会感觉很浪费数据库调用。但是您可以将get()调用更改为exists()调用,并且仅检查id的存在,而不是加载整个实例以查看它是否在那里。

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

关于design-patterns - 服务层方法应该使用实例还是ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17455315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com