2016-12-06 1 views
0

に別の組成物に依存オブジェクトを再利用:どのように私は以下のような2つのサービスクラス...</p> <p>ユーザーサービス持っているケーキのパターン

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を提供するのではなく、どのように私がgroupserviceのdaoオブジェクトを使うことができるかです。 UserServiceとGroupServiceの型が同じであるためです。

私は、次の

val userService = new UserService with dao 

を使用してみましたが、これは失敗しました。私はスカラーには新しいので、なぜこれが失敗したのかは明らかではありません。これが法的でない理由を誰かが明らかにすることができれば助けになるでしょう。私は右のあなたの質問を理解していれば、事前に

感謝:)

答えて

1

、あなたはケーキのパターンを使用して複数の依存関係を宣言するためのソリューションを探しています。

一般的に使用される解決策は、必要なすべての依存関係への参照を含むコンポーネントの新しいタイプを定義することです。具体的なケースでは、ストーリーは次のようになります。

trait GroupServiceComponent { 
    val userService: UserService 
    val userGroupDao: UserGroupDao 

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

詳細情報が必要な場合はお知らせください。

+0

ああは...それを得た...それは本当に有益だった...おかげでたくさん... – ArunavaS

0

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

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!") 
    } 
    } 
} 
+0

うん...しかし、グループつもりが、それは自分の異なるDAOだと仮定している場合、これは失敗します。..私はそれが自分の操作のために別のサービスからDAOを貸す良いアプローチではない...何を言っているの? – ArunavaS

関連する問題