这个问题可以帮助您了解我的需求。 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
}
关于scala - 蛋糕图案 : how to get all objects of type UserService provided by components,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532428/