gpt4 book ai didi

scala - 带有蛋糕模式的 Scala 中的 DI

转载 作者:行者123 更新时间:2023-12-01 09:56:37 25 4
gpt4 key购买 nike

这个article通过 Scala 的 Cake Pattern 解释依赖注入(inject).

我对这种模式的好处的理解是,可以将特征与静态检查混合在(生产与测试)中。

在 Bonér 先生的示例中,他列出了这个完成的(每个示例)代码:

用户存储库组件 用户服务组件

我根据我的理解添加了评论。

trait UserRepositoryComponent {
val userRepository: UserRepository // stand-alone component

class UserRepository {
... // actual implementation here
}
}
trait UserServiceComponent {
this: UserRepositoryComponent => //Requires a mixed-in UserRepo*Component

val userService: UserService

class UserService {
... // actual implementation here
}
}

我的理解是 Service取决于注入(inject) Repository零件。

出于生产目的,以下可用于连接“生产” Repository组件到 UserServiceComponent :
object ComponentRegistry extends 
UserServiceComponent with
UserRepositoryComponent
{
val userRepository = new UserRepository
val userService = new UserService
}

如果我们的生产代码想要使用 userRepositoryuserService , 是通过简单的 import 使用它们的正确方法?

到目前为止,我认为我理解了一半的文章,但是我不确定如何使用 ComponentRegistry目的。

最佳答案

你首先跑进了末日兄弟的面包店:
What are some compelling use cases for dependent method types?

要回答你的问题,正确的使用方法userService将是使用另一个特征并将其蛋糕化:

trait Example { this: UserServiceComponent => 
def getExampleUser() = userService.getUser("ExampleUser")
}

现在,无论这个新特性做什么,都不会直接与对象 ComponentRegistry 之类的东西耦合。 .相反,您的应用程序变为:
object Application extends 
Example with
UserServiceComponent with
UserRepositoryComponent
{
val userRepository = new UserRepository
val userService = new UserService
}

不管怎样,你应该跑去爬山,因为如果你真的想用蛋糕,你应该做更多这样的事情:
trait UserRepositoryComponent {

type UserRepository <: UserRepositoryLike

val userRepository: UserRepository

trait UserRepositoryLike {
def getUserOrSomething()
}

}

trait UserRepositoryComponentImpl extends UserRepositoryComponent {

type UserRepository = UserRepositoryImpl
val userRepository = new UserRepositoryImpl

class UserRepositoryImpl extends UserRepositoryLike {
override def getUserOrSomething() = ???
}

}

trait UserServiceComponent {
this: UserRepositoryComponent =>

type UserService <: UserServiceLike
val userService: UserService

trait UserServiceLike {
def getUserNameById(id: Int): String
}

}

trait UserServiceComponentImpl extends UserServiceComponent {
this: UserRepositoryComponent =>

type UserService = UserServiceImpl
val userService = new UserServiceImpl

class UserServiceImpl extends UserServiceLike {
override def getUserNameById(id: Int) = userRepository.getUserOrSomething
}

}

trait Example {
this: UserServiceComponent =>

def getExampleUser() = userService.getUserNameById(1)

}

object Application extends
Example with
UserRepositoryComponentImpl with
UserServiceComponentImpl

现在节省一些时间,放下蛋糕图案,做点什么 simple .

关于scala - 带有蛋糕模式的 Scala 中的 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25313143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com