如何在Cake Pattern中分离业务类和辅助特征?

时间:2011-05-06 20:02:06

标签: scala dependency-injection

Cake Pattern如下所示:

trait UserRepositoryComponent {  
  val userRepository: UserRepository  
  class UserRepository {...}
}

trait UserServiceComponent {this: UserRepositoryComponent =>   
  val userService: UserService    
  class UserService {...}  
}

UserServiceUserRepository是真正的业务类。我们可以使用带有和没有Cake模式的它们。

相反,特征UserServiceComponentUserRepositoryComponent只是辅助样板代码而不是真正的业务组件。我们只需要它们来实现模式。

鉴于此,我不希望UserServiceUserRepository成为UserServiceComponentUserRepositoryComponent的内部类。是否有意义?我可以不将它们作为内部类来实现吗?

1 个答案:

答案 0 :(得分:3)

您没有需要来包装您的实现类,例如你可以这样写:

trait UserRepository { ... }
trait UserService { this: UserRepository => ... }

但是创建组件需要同时实例化包含所有组件的单个对象:

new UserRepositoryImpl with UserServiceImpl

因此,来自UserRepositoryUserService的方法将混合在一个实例中,这不一定是您想要的(如果您的组件定义具有相同名称的方法,则会导致问题)。

因此,将组件包装在“样板”特征中会创建有用的命名空间。