蛋糕图案
article建议使用特征作为命名空间:
trait UserRepositoryComponent {
val userRepository: UserRepository
class UserRepository {...}
}
trait UserServiceComponent {this: UserRepositoryComponent =>
val userService: UserService
class UserService {...}
}
class Context extends UserServiceComponent with UserRepositoryComponent {
val userRepository = new UserRepository
val userService = new UserService
}
但是,如果我们可以执行以下操作,我们真的需要这些“命名空间特征”(UserServiceComponent
和 UserRepositoryComponent
)吗?
trait UserRepository {...}
trait UserService {this: UserRepository =>
...
}
class Context extends UserRepositoryImpl with UserService
所以,我的问题是我们何时以及为何需要 Cake Pattern
中的“命名空间”特性。
最佳答案
您的方法有两个缺点:
Context
承担了太多责任,混淆了来自UserRepository
、UserService
等的方法;- 在第一个片段中,您可以控制初始化的顺序,或者延迟某些组件的初始化 - 例如,您可以将
userRepository
设为lazy val
,这将显着简化测试,如果您只想测试userService
(因此不想引导整个基础架构);
虽然我不推荐它,但在第一种情况下,您还可以在运行时更改注入(inject)实体(使用 var
s)。
关于scala - 关于蛋糕图案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5898009/