在一个常见的 MVC 设计的应用程序中,使服务层依赖于用户会话是一个坏主意吗?假设有一个服务方法从数据库中获取一些对象,并且您希望根据谁初始化调用返回不同的结果 - 例如,管理员可能会获得 10 行对象,而普通用户可能只会获得 7 行因为最后 3 个是“仅限管理员”的对象。解决此问题的几种方法是:
- 引入一个包含调用用户的新方法参数。在许多方法中必须投入用户参数,但不依赖但很麻烦。
- 为不同的用户角色制定不同的方法(有多个结果)。也没有依赖,但有很多方法基本上做同样的事情,这增加了代码重复的风险。
- 让该方法从存储当前用户会话的静态上下文中的 ThreadLocal 变量中读取。此变量在每个请求之前设置。
最近,我越来越多地开始使用最后一种方法,因为它提供了一个干净的界面并且感觉非常实用。过滤器确保当前线程始终具有用户集。这是糟糕的设计吗?我相信有些人会认为这是从服务层到 Web 层的依赖关系,尽管我个人认为它们是非常分离的。最大的后果是一个方法的行为会根据另一个类的状态而有所不同,这可能是一件坏事,也是一件好事。
您对此有何看法?如果这是一个糟糕的解决方案,那么更强大的解决方案是什么?