这个问题可以帮助您了解我的需求。 Cake pattern: one component per implementation, or one component per trait?
我有一个使用多个 UserService 实现的 Scala 应用程序,这些实现将由组件提供?
我想知道在另一个组件中是否有一种方法可以“扫描”应用程序,以便我可以检索一组提供实现 Trait UserService 的对象的所有组件? 这样我就可以遍历蛋糕构建应用程序提供的所有 UserService 接口(interface)?
我想我可以有一个组件根据其依赖关系构建 UserService 列表,但是是否可以让该组件构建列表而无需任何硬编码依赖关系?
请您参考如下方法:
您可以简单地将 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
}


