在View中进行验证是一个很好的用户界面,因此用户不会错误地点击它。我认为控制器验证是“真正的”验证,因为命令是在哪里创建的。如果用户没有权限,则她应该无法创建(甚至达到该操作)该命令。
我认为将检查放在处理程序中有点过分,因为授权并不是它的责任,并且不像用户可以直接访问该处理程序。
我认为最终授权应该在应用程序服务级别上完成,即作为处理命令的一部分。例如,您可以使用授权处理程序包装命令处理程序。
class AuthorizationHandler : IHandle<SetCustomerAsPreferred> { IHandle<SetCustomerAsPreferred> innerHandler; public AuthorizationHandler(IHandle<SetCustomerAsPreferred> handler) { innerHandler = handler; } public void Handle(SetCustomerAsPreferred command) { if (/* not authorized */) throw ... innerHandler.Handle(command); } } class SetCustomerAsPreferredCommandHandler : IHandle<SetCustomerAsPreferred> { public void Handle(SetCustomerAsPreferred command) { // do the work } }