【发布时间】:2020-11-29 15:21:50
【问题描述】:
我正在尝试使用存储库模式将一些代码从 Vapor 3 迁移到 Vapor 4。我已经阅读了 Vapor 4 文档中的documentation of this specific pattern,我想我大部分都理解了。
但是,我没有得到的一件事是在 Application 扩展中设置存储库工厂的方式。文档中的示例显示了这一点:
extension Application {
private struct UserRepositoryKey: StorageKey {
typealias Value = UserRepositoryFactory
}
var users: UserRepositoryFactory {
get {
self.storage[UserRepositoryKey.self] ?? .init()
}
set {
self.storage[UserRepositoryKey.self] = newValue
}
}
}
如果我正确读取了 getter 方法(我可能不是 - 我远非 Swift 专家),当引用 app.users 时,将创建并返回 UserRepositoryFactory 结构的新实例。但是,当时self.storage[UserRepositoryKey.self] 的内容似乎没有发生任何变化。因此,如果我碰巧连续两次访问 app.users,我会收到 2 个 不同 实例返回给我,而 self.storage[UserRepositoryKey.self] 将保持设置为 nil。
按照文档中的其余示例代码,它似乎定义了工厂在配置应用程序时将使用的 make 函数:
app.users.use { req in
DatabaseUserRepository(database: req.db)
}
这里似乎app.users.use 将获得一个新的工厂实例并调用其use 函数来为该实例设置适当的make 方法。
后来,当我去处理一个请求时,我使用了这个Request扩展定义的request.users方法:
extension Request {
var users: UserRepository {
self.application.users.make!(self)
}
}
这里似乎self.application.users.make 将在self.application.users 引用的不同存储库工厂实例上调用。因此,它不会应用之前在配置应用程序时设置的工厂的 make 方法。
那么我在这里错过了什么?
【问题讨论】:
标签: vapor vapor-fluent