Шаблон Cake: как получить все объекты типа UserService, предоставляемые компонентами

Этот вопрос может помочь вам понять мои потребности. Шаблон торта: один компонент на реализацию или один компонент на черту?

У меня есть приложение Scala, использующее несколько реализаций UserService, которые будут предоставлены компонентом (ами).

Интересно, есть ли способ в другом компоненте "сканировать" приложение, чтобы я мог получить набор всех компонентов, предоставляющих объект, который реализует свойство UserService? Чтобы я мог перебирать все интерфейсы UserService, предоставляемые моим приложением, созданным для торта?

Я предполагаю, что у меня может быть компонент, который формирует список UserService в соответствии с его зависимостью, но возможно ли, чтобы этот компонент формировал список без какой-либо жестко закодированной зависимости?

1 ответ

Решение

Вы можете просто иметь список 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
}
Другие вопросы по тегам