0

我的 DAO 类中处理文件夹的所有方法(Web 应用程序是关于云存储的,如谷歌驱动器)都将 User 作为第一个参数。使用此参数以便当前用户只能访问他或她拥有的文件夹。

一些例子:

class FolderDAO {
    def findRoot(user: User): Future[Option[DBFolder]] = { /* implementation */}

    def findById(user: User, folderId: Long): Future[Option[DBFolder]] = { /* implementation */}

    def findChildren(user: User, folder: DBFolder): Future[List[DBFolder]] = { /* implementation */}
}

等等。

有可能有一天我需要一种不需要用户参数的方法,但它仍然是少数。

正如您可能想象的那样,使用这些方法非常麻烦。

我确定了该问题的 3 个解决方案:

  1. 保持原样,因为可读性最重要
  2. 用户服务存储当前用户并且所有其他服务(和 DAO)都可以访问(这看起来像一个全局变量,但服务是可注入的,所以测试是可以的)
  3. 这些方法的隐式用户参数

带有隐式:

def findRoot()(implicit user: User): Future[Option[DBFolder]]

def findById(folderId: Long)(implicit user: User): Future[Option[DBFolder]]

def findChildren(folder: DBFolder)(implicit user: User): Future[List[DBFolder]]

您认为这里最好的选择是什么?

这篇StackOverflow 帖子对这个问题提供了一些见解,但没有太大帮助,不幸的是

4

1 回答 1

2

I would probably use a fourth option:

trait UserService {
  def findRoot(): Future[Option[DBFolder]]
  def findById(folderId: Long): Future[Option[DBFolder]]
  def findChildren(folder: DBFolder): Future[List[DBFolder]]
}

def userService(user: User): UserService = ???

I'm generally skeptical to using implicit parameters just for saving some characters when calling the method. It decreases clarity for little benefit.

于 2014-12-11T15:11:35.840 回答