验证某个文档的所有者哪个更好?

时间:2012-11-10 14:34:28

标签: architecture application-design

我们有一个WCF服务,其方法例如取消给定id的订单。 我们网站的任何用户都可以从网上调用此方法。

在此方法的某处,我们必须检查具有给定ID的订单属于当前登录的用户(我们读取授权cookie)。

执行此检查的最佳位置是什么?

在WCF方法中,我们启动业务流程,在其中的某个地方,我们要求存储库按id加载订单。

我们可以进行一些这样的开放式网络操作。而且我希望忘记尽可能低地进行这样的所有权检查 - 我想在一个狭窄的地方实现这样的检查,每个代码分支都会进行检查。

我可以在存储库中进行这样的检查,但我现在确定这种验证是它的责任。 此外,我可以通过将行为属性应用于服务或其操作来实现某种声明性验证,但我不确定这是正确的位置,因为我们必须至少加载两次订单 - 首先执行所有权测试,然后是业务流程。

1 个答案:

答案 0 :(得分:1)

每项服务都有安全边界的责任。因此,服务方法应在调用必要的业务逻辑之前执行其输入参数的验证调用。最重要的是,你应该总是快速失败 - 如果方法调用无论如何都会失败,请确保它尽快失败(另请参阅http://en.wikipedia.org/wiki/Fail-fast)。

因此,您的服务方法调用验证方法(每个服务方法编写一个验证程序类),并且该方法可以在不允许操作时抛出验证异常,或返回状态代码。通常首选例外,因为它们会停止执行并强制调用堆栈对它们起作用。

验证方法的工作原理是另一回事。它可以调用存储库并询问交易所有者是谁。无论如何实现它,工作都隐藏在验证器类中。