首先,您应该UserServiceComponent
从以下实现中解耦UserService
:
trait UserService extends RepositoryDelegator[User] {
def getPublicProfile(id: String): Either[Error, User]
}
trait UserServiceComponent {
val userService: UserService
}
trait DefaultUserServiceComponent extends UserServiceComponent { self: UserRepositoryComponent =>
protected class DefaultUserService extends UserService {
def getPublicProfile(id: String): Either[Error, User] = userRepository.getPublicProfile(id)
}
val userService: UserService = new DefaultUserService
}
trait AlternativeUserServiceComponent extends UserServiceComponent {
protected class AlternativeUserService extends UserService {
def getPublicProfile(id: String): Either[Error, User] = call webservice here for exemple...
}
val userService: UserService = new AlternativeUserService
}
如果这看起来很冗长,那就是。蛋糕图案不是特别简洁。
但请注意它如何解决您的问题,即UserRepositoryComponent
即使在实际上不需要时(例如仅使用时AlternativeUserService
)也存在依赖关系。
现在,在实例化应用程序时,我们所要做的就是混合使用DefaultUserServiceComponent
或AlternativeUserServiceComponent
。
如果您碰巧需要访问这两个实现,您确实应该公开两个 userService 值名称。好吧其实是3个名字,比如:
DefaultUserService
实现 的 defaultUserService
AlternativeUserService
用于实现 的替代用户服务
- 任何实现的 mainUserService
UserService
(应用程序在“混合时间”选择哪一个)。
举例:
trait UserService extends RepositoryDelegator[User] {
def getPublicProfile(id: String): Either[Error, User]
}
trait MainUserServiceComponent {
val mainUserService: UserService
}
trait DefaultUserServiceComponent { self: UserRepositoryComponent =>
protected class DefaultUserService extends UserService {
def getPublicProfile(id: String): Either[Error, User] = userRepository.getPublicProfile(id)
}
val defaultUserService: UserService = new DefaultUserService
}
trait AlternativeUserServiceComponent {
protected class AlternativeUserService extends UserService {
def getPublicProfile(id: String): Either[Error, User] = ??? // call webservice here for exemple...
}
val alternativeUserService: UserService = new AlternativeUserService
}
然后你可以像这样实例化你的蛋糕:
object MyApp
extends MainUserServiceComponent
with DefaultUserServiceComponent
with AlternativeUserServiceComponent
with MyUserRepositoryComponent // Replace with your real UserRepositoryComponent here
{
//val userService = defaultUserService
val mainUserService = alternativeUserService
}
在上面的示例中,明确想要访问 的服务DefaultUserService
将DefaultUserServiceComponent
作为其组件的依赖项(与AlternativeUserService
和相同AlternativeUserServiceComponent
),而只需要一些 UserService
的服务将改为MainUserServiceComponent
作为依赖项。您在“混合时间”决定哪个服务mainUserService
指向(这里,它指向DefaultUserService
实现。