美文网首页
Vapor学习之Services

Vapor学习之Services

作者: 小熊学编程 | 来源:发表于2019-08-07 17:04 被阅读0次

Service

Services 是一个用于 Vapor 的依赖注入(也叫做反向控制)框架。这个 services 框架允许你去注册、配置和初始化任何应用中可能需要的服务。

Container

大多数是通过容器来进行服务之间的交互的。一个容器是由以下构成的:

  • Services: 一系列已注册的服务
  • Config: 特定服务的配置
  • Environment: 应用当前环境(测试、生产环境等等)
  • Worker: 关联容器的 event loop

Vapor使用的大多数容器是:

  • Application
  • Request
  • Response

启动应用时你应该使用 Application 来作为容器去创建必要的服务。使用 RequestResponse 容器来创建响应 request 的服务(在路由闭包和控制器中)

Make

创建服务很简单,只需要在容器上调用.make(_:)并传递你想要的类型,该类型通常是一个协议,比如:Client

let client = try req.make(Client.self)

如果你明确知道想要哪个服务,也可以直接指定具体的类型。

let leaf = try req.make(LeafRenderer.self)
print(leaf) /// Definitely a LeafRenderer

let view = try req.make(ViewRenderer.self)
print(view) /// ViewRenderer, might be a LeafRenderer

提示: 尽可能的依赖于协议而不是具体类型。这将会更容易测试你的代码(可以很容易的切换具体实现),可以对代码进行解耦。

Services

Services 结构体包含了所有已注册过的服务(包括你自己或service提供者的),你将经常需要在 configure.swift文件中注册配置你的服务。

Instance

你可以使用.register(_:)来注册初始化服务实例。

/// Create an in-memory SQLite database
let sqlite = SQLiteDatabase(storage: .memory)

/// Register to sevices.
services.register(sqlite)

注册完一个服务后,可以通过 Container 来创建

let db = app.make(SQLiteDatabase.self)
print(db) // SQLiteDatabase (the one we registered earlier)

Protocol

注册服务时,你也可以约束一个具体协议。你可能已经注意到 Vapor 是如何注册它的路由器的。

/// Register routes to the router
let router = EngineRouter.default()
try routes(router)
services.register(router, as: Router.self)

因为使用了 as: Router.self 来注册 router,所以我们可以使用具体类型或协议来创建它。

let router = app.make(Router.self)
let engineRouter = app.make(EngineRouter.self)
print(router) // Router (actually EngineRouter)
print(engineRouter) // EngineRouter
print(router === engineRouter) // true

Environment

Environment 用来动态改变 Vapor app 在特定场景下的行为。比如,应用部署后你可能想使用不同的用户名和密码用于数据库。使用 Environment 就可以很容易地管理起来。

当从命令行运行 Vapor app 时,你可以传递--env 参数来指定环境。默认情况下当前环境会是.development

swift run Run --env prod

上述例子中,我们以.production 环境来运行 Vapor。该环境指定了 isRelease = true

你可以使用传递到 configure.swift 中的 environment 来动态注册服务。

let sqlite: SQLiteDatabase
if env.isRelease {
    /// Create file-based SQLite db using $SQLITE_PATH from process env
    sqlite = try SQLiteDatabase(storage: .file(path: Environment.get("SQLITE_PATH")!))
} else {
    /// Create an in-memory SQLite database
    sqlite = try SQLiteDatabase(storage: .memory)
}
services.register(sqlite)

提示: 使用静态方法 Environment.get(_:) 来获取环境的字符串值。
你也可以基于 environment 使用 .register(_:) 方法来动态注册服务。

services.register { container -> BCryptConfig in
  let cost: Int

  switch container.environment {
  case .production: cost = 12
  default: cost = 4
  }
  return BCryptConfig(cost: cost)
}

Config

如果多个服务都适用于给定的协议,你需要使用 Config 来声明你更想用哪个。

ServiceError.ambiguity: Please choose which KeyedCache you prefer, multiple are available: MemoryKeyedCache, FluentCache<SQLiteDatabase>.

这也可以在configure.swift中完成,只需要使用 config.prefer(_:for:) 方法。

/// Declare preference for MemoryKeyedCache anytime a container is asked to create a KeyedCache
config.prefer(MemoryKeyedCache.self, for: KeyedCache.self)

/// ...

/// Create a KeyedCache using the Request container
let cache = req.make(KeyedCache.self)
print(cache is MemoryKeyedCache) // true

相关文章

  • Vapor学习之Services

    Service Services 是一个用于 Vapor 的依赖注入(也叫做反向控制)框架。这个 services...

  • Vapor学习之Toolbox

    Toolbox介绍 打印vapor相关操作介绍 也可以在任意toolbox命令中运行 --help 选项 新建 T...

  • Vapor学习之Application

    Application 项目启动时,你可以使用Application来创建任何你需要的服务最佳访问Applicat...

  • Vapor学习之Controllers

    控制器 控制器可以用来组织你的代码,它们是一系列用于接收 request 和返回 response 的方法集合。通...

  • Vapor学习之Routing

    路由 用来查找 request 对应的 response 创建路由器 Vapor中默认路由是 EngineRout...

  • Vapor学习之Content

    Content Vapor3 中所有的 content 类型(JSON、protobuf、FormURLEncod...

  • Vapor学习之Xcode

    如果使用Mac开发Vapor项目时,可以使用Xcode对项目进行调试包括编译、运行和停止服务,也可以通过断点和工具...

  • Vapor学习之Deployment

    Deployment 部署代码使得你的 Vapor 项目可公开被访问到。它是 Web 开发中最困难的。幸运的是,有...

  • Vapor学习之环境搭建

    验证安装 通过终端命令行查看vapor是否安装 结果输出 安装Toolbox Toolbox 包含所有Vapor依...

  • Vapor学习之项目创建

    创建新项目 创建一个名为Hello的新项目 创建成功后进入项目目录 生成Xcode项目 使用 Vapor Tool...

网友评论

      本文标题:Vapor学习之Services

      本文链接:https://www.haomeiwen.com/subject/vmoodctx.html