Шаблон 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
}