3

この質問は、私のニーズを理解するのに役立つかもしれません。 ケーキパターン:実装ごとに1つのコンポーネント、または特性ごとに1つのコンポーネント?

コンポーネントによって提供される複数のUserService実装を使用するScalaアプリケーションがあります。

別のコンポーネントにアプリケーションを「スキャン」して、トレイトUserServiceを実装するオブジェクトを提供するすべてのコンポーネントのセットを取得できるようにする方法があるのでしょうか。ケーキビルドアプリケーションによって提供されるすべてのUserServiceインターフェイスを反復処理できるようにするには?

依存関係に従ってUserServiceのリストを作成するコンポーネントを作成できると思いますが、ハードコードされた依存関係がなくても、このコンポーネントでリストを作成することはできますか?

4

1 に答える 1

6

UserServiceインスタンスのリストをに直接入れUserServiceComponentて、ベースUserServiceレジスタ自体をこのリストに含めることができます。

trait UserServiceComponent {
  private val _userServices = collection.mutable.Buffer[UserService]()
  def userServices: Seq[UserService] = _userServices.synchronized {
    _userServices.toList // defensive copy
  }
  private def registerUserService( service: UserService ) = _userServices.synchronized {
    _userServices += service
  }

  trait UserService {
    registerUserService( this )

    def getPublicProfile(id: String): Either[Error, User]
  }

  val mainUserService: UserService
}

trait DefaultUserServiceComponent extends UserServiceComponent { self: UserRepositoryComponent =>
  protected class DefaultUserService extends UserService {
    // NOTE: no need to register the service, this is handled by the base class
    def getPublicProfile(id: String): Either[Error, User] = userRepository.getPublicProfile(id)
  }
  val mainUserService: UserService = new DefaultUserService
}
于 2013-01-26T13:42:30.817 に答える