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

发布于 2024-11-05 13:17:03 字数 731 浏览 1 评论 0 原文

蛋糕模式看起来像如下:

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

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

UserServiceUserRepository 类是真正的业务类。我们可以在有或没有蛋糕模式的情况下使用它们。

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

鉴于此,我不希望 UserService 和 UserRepository 成为 UserServiceComponent 和 UserRepositoryComponent 的内部类。有道理吗?我可以不将它们实现为内部类吗?

The Cake Pattern looks as follows:

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

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

The classes UserService and UserRepository are real business classes. We can use them with and without the Cake pattern.

The traits UserServiceComponent and UserRepositoryComponent, on the contrary, are just auxiliary boilerplate code rather than real business components. We need them just to implement the pattern.

Given that, I would not like UserService and UserRepository to be inner classes of UserServiceComponent and UserRepositoryComponent. Does it make sense? Can I implement them not as inner classes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嗳卜坏 2024-11-12 13:17:03

您不需要需要包装您的实现类,例如您可以编写类似的内容:

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

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

new UserRepositoryImpl with UserServiceImpl

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

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

You don’t need to wrap your implementation classes, e.g. you could write something like that:

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

But creating you components would need to instantiate a single object containing all your components at once:

new UserRepositoryImpl with UserServiceImpl

So, methods from UserRepository and UserService would be mixed in a single instance, which is not necessarily what you want (and which would cause problems if your components define methods with the same name).

Thus, wrapping your components in “boilerplate” traits creates useful namespaces.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文