好的。所以这是我的简化方案。我们有一个系统可以处理许多客户的订单。我们希望员工用户能够查看所有订单,我们希望客户用户只能查看与其相关的订单。
当尝试查看特定记录时,我们在 OrderSecurity 类中使用以下函数:
Public Function CanViewOrder(order)
If currentUser.MemberOfStaff() Then
CanViewOrder = True
Else
CanViewOrder = (order.ClientId = currentUser.ClientId)
End If
End Function
当我们想要向用户显示订单列表时,我们可以在 OrderService 类中定义以下函数
Public Function GetOrders()
If currentUser.MemberOfStaff() Then
GetOrders = GetAllOrders()
Else
GetOrders = GetAllOrdersForClient(currentUser.ClientId)
End If
End Function
这对上述情况来说是可以的,但随着规则变得更加复杂,这并不能很好地维持。比如说,我们添加了另一种用户类型,它代表了一个不太受信任的员工,他只能查看来自客户子集的订单。然后,我们必须向 CanViewOrder 和 GetOrders 函数(可能在数据访问类中)添加逻辑,这在我看来违反了 DRY 原则。
所以,我的问题是:我是否在这里遗漏了一个技巧 - 是否有某种方法可以组合业务逻辑以获得在一个地方查看订单的权限,这两个功能都可以使用?
还是我太担心了,应该继续前进,在两个地方都有逻辑?
(在这个特定的应用程序中,我使用的是 ASP Classic - 不要讨厌播放器,讨厌游戏 - 但我会对你如何用任何语言解决这个问题感兴趣)