@ fastify/ awilix (中文(简体) )
对固化框架的依赖性注射支持,使用 阿维利克斯。 。 。 .
开始
首先,安装软件包和awilix:
npm i @fastify/awilix awilix
接下来,设置插件 :
const { fastifyAwilixPlugin } = require('@fastify/awilix')
const fastify = require('fastify')
app = fastify({ logger: true })
app.register(fastifyAwilixPlugin, {
disposeOnClose: true,
disposeOnResponse: true,
strictBooleanEnforced: true
})
然后,注册一些模块进行注射:
const {
diContainer, // this is an alias for diContainerProxy
diContainerClassic, // this instance will be used for `injectionMode = 'CLASSIC'`
diContainerProxy // this instance will be used by default
} = require('@fastify/awilix')
const { asClass, asFunction, Lifetime } = require('awilix')
// Code from the previous example goes here
diContainer.register({
userRepository: asClass(UserRepository, {
lifetime: Lifetime.SINGLETON,
dispose: (module) => module.dispose(),
}),
})
app.addHook('onRequest', (request, reply, done) => {
request.diScope.register({
userService: asFunction(
({ userRepository }) => {
return new UserService(userRepository, request.params.countryId)
},
{
lifetime: Lifetime.SCOPED,
dispose: (module) => module.dispose(),
}
),
})
done()
})
请注意,没有严格的使用类的要求,也可以登记原始值,使用其中之一 asFunction(),或 asValue()检查 awilix 文档 更多细节.
在所有模块注册后,可以通过从应用范围注入的依赖性来解决 diContainer 和请求范围d diScope。注意: diScope 允许从父程序解析所有模块 diContainer 范围 :
app.post('/', async (req, res) => {
const userRepositoryForReq = req.diScope.resolve('userRepository')
const userRepositoryForApp = app.diContainer.resolve('userRepository') // This returns exact same result as the previous line
const userService = req.diScope.resolve('userService')
// Logic goes here
res.send({
status: 'OK',
})
})
插件选项
injectionMode - 使用PROXY或CLASIC注射方式。 见 awilix 文档 详细情况。 默认为“ PROXY ” .
container - 预设的 AwilixContainer 实例,该插件应当使用。 默认情况下,插件会使用自己的实例. 注意你无法同时说明 injectionMode 财务报告和审定财务报表 container 参数在同一时间.
disposeOnClose - 自动引用已配置 dispose 应用级 diContainer 结接实例关闭时用钩子.
处置在 onClose 接钩.
默认值是 true
disposeOnResponse - 自动引用已配置 dispose 请求一级 diScope 答发后取钩.
处置在 onResponse 接钩.
默认值是 true
asyncInit - 是否处理 asyncInit 字段。 请注意,所有具有激活功能的依赖性都会被急切地瞬间切入. 失效将使应用程序启动速度略快一些.
默认值是 true
asyncDispose - 是否处理 asyncDispose 字段。 关闭会让应用程序收尾稍快一点.
默认值是 true
eagerInject - 是否处理 eagerInject 字段在 DI 解析器配置中,该解析器立即对模块进行即时和缓存。 失效将使应用程序启动速度略快一些.
默认值是 true
strictBooleanEnforced - 如果 enabled 字段在解析器配置中设置一个不支持的值(任何与 true 财务报告和审定财务报表 false) (中文(简体) ).
默认值是 true
enableDebugLogging 是否在每次依赖开始和完成初始化时日志 asyncInit 阶段。 这对于初始化期间调试超时问题很有用,因为它有助于识别哪些依赖性被挂起或者设置花费了过多的时间.
默认值是 false
loggerFn - 处理日志消息的回调功能,当 enableDebugLogging 已启用。 该函数收到包含日志消息的单一字符串参数.
默认值是 console.log
onNonBlockingInitError - 对登记在册的依赖关系所抛出的错误召回 asyncInit: { nonBlocking: true },则在 asyncInit 阶段。 该函数收到依赖名称和错误.
默认值以 console.error
定义类
所有依赖性模块均使用构造器注入(用于 asClass)或函数参数(用于 asFunction),通过传递集合依赖对象,其中键
对象匹配用于注册模块的密钥 :
class UserService {
constructor({ userRepository }) {
this.userRepository = userRepository
}
dispose() {
// Disposal logic goes here
}
}
class UserRepository {
constructor() {
// Constructor logic goes here
}
dispose() {
// Disposal logic goes here
}
}
diContainer.register({
userService: asClass(UserService, {
lifetime: Lifetime.SINGLETON,
dispose: (module) => module.dispose(),
}),
userRepository: asClass(UserRepository, {
lifetime: Lifetime.SINGLETON,
dispose: (module) => module.dispose(),
}),
})
字迹使用
默认 @fastify/awilix 正在使用通用空 Cradle 财务报告和审定财务报表 RequestCradle 界面,可以用您自己的类型扩展它们:
awilix 将 Cradle 定义为代理, 并调用它的获取器将触发一个 container.resolve 用于给定模块. 更多信息。 。 。 .
declare module '@fastify/awilix' {
interface Cradle {
userService: UserService
}
interface RequestCradle {
user: User
}
}
//later, type is inferred correctly
fastify.diContainer.cradle.userService
// or
app.diContainer.resolve('userService')
// request scope
request.diScope.resolve('userService')
request.diScope.resolve('user')
查找更多内容 测试 或者说 awilix 文档中的例子。 。 。 .
同步注射、处置和急切注射
fastify-awilix 支持扩展的 awilix 解析器选项,由 awilix 管理器数字 :
const { diContainer, fastifyAwilixPlugin } = '@fastify/awilix'
const { asClass } = require('awilix')
diContainer.register(
'dependency1',
asClass(AsyncInitSetClass, {
lifetime: 'SINGLETON',
asyncInit: 'init',
asyncDispose: 'dispose',
eagerInject: true,
})
)
app = fastify()
await app.register(fastifyAwilixPlugin, { asyncInit: true, asyncDispose: true, eagerInject: true })
await app.ready()
高级 DI 配置
对于更先进的使用案例,请检查官方 awilix 文档。 。 。 .
许可证
许可证根据 麻省理工学院。 。 。 .