我正在尝试使用存储库模式将一些代码从 Vapor 3 迁移到 Vapor 4。我已经阅读了Vapor 4文档中有关此特定模式的文档,并且我想我大部分都理解它。
然而,我没有得到的一件事是存储库工厂在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 专家还很远),一个新的UserRepositoryFactory
结构实例将被创建并在app.users
被引用时返回。但是,当时的内容似乎没有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.users
这个Request
扩展定义的方法:
extension Request {
var users: UserRepository {
self.application.users.make!(self)
}
}
在这里,它似乎self.application.users.make
会在由self.application.users
. 因此,它不会应用之前在配置应用程序时设置的工厂的 make 方法。
那么我在这里错过了什么?