0

以下のような2つのサービスクラスがあります...

ユーザーサービス:

class UserService { dao: UserGroupDao =>
 ...
 def read(userId: String): Future[Option[User]] = dao.readUser(userId)
 ...
}

グループサービス:

class GroupService {dao: UserGroupDao =>
 def createGroup(group: Group): Future[Either[String, String]]) = {
  val userService = new UserService() with UserMysqlDao
  userService.read(group.ownerId) map {
   case Some(u) => dao.createGroup(group)
   case None => Left("Invalid User!")
  }
 }
 ...
}

グループの所有者が有効なユーザーであるかどうかを検証しているだけです。そのために、ハードコーディングされた Dao 実装、つまり UserMySqlDao で userService.read メソッドを再利用しました。
ここで私の質問は、ハードコードされた Dao Impl を提供する代わりに、グループサービスの dao オブジェクトをどのように使用できるかということです。UserService と GroupService のタイプが同じであるためです。

私は以下を使用してみました

val userService = new UserService with dao

しかし、これは失敗しました。私はscalaが初めてなので、なぜこれが失敗したのかよくわかりません。これが合法ではない理由を誰かが明らかにしてくれると助かります。

前もって感謝します :)

4

2 に答える 2

0

楽しみのために遊んで、コンパイルできるものを見てみたいと思いました。これが良い解決策であるか、良いスタイルであるかはわかりませんが、GroupService を UserService に依存させて、dao を公開することを考えました。

class UserService { d: UserGroupDao =>
  val dao = d
  def read(userId: String): Future[Option[User]] = dao.readUser(userId)
}

class GroupService { svc: UserService =>
  def createGroup(group: Group): Future[Either[String, String]] = {
    svc.read(group.ownerId) map {
      case Some(_) => svc.dao.createGroup(group)
      case None => Left("Invalid User!")
    }
  }
}
于 2016-12-06T21:30:58.440 に答える