Skip to main content

提供者

TieJS 框架最核心的特性是使用依赖注入 (Dependency injection) 组织代码,提供者 (Provider) 是用来组织代码的最小单位。

什么是提供者 (Provider)?#

提供者很简单,只不过是一个用 @Injectable() 装饰器注释的简单类,在 TieJS 中提供者包含服务(Service)、存储库(Repository)、中间件(Middleware)、插件(Plugin)、配置(Config)等。

服务 (Service)#

服务是业务逻辑的抽象,通常你会在 Controller 或 Resolver 中通过依赖注入的方式调用 Service,TieJS 使用 依赖注入 的方式组织代码,这是非常重要特性,因为它使代码有更好的可读性,也更易于进行单元测试。

import { Injectable } from '@tiejs/common'
import { User } from './user.type'
import { CreateUserInput } from './createUser.input'
@Injectable()
export class UserService {
private users: User[] = [
{
name: 'Jack',
age: 16,
},
{
name: 'Rose',
age: 15,
},
]
async queryUser(): Promise<User[]> {
return this.users
}
async getUser(name: string): Promise<User> {
const user = this.users.find(user => user.name === name)
if (!user) throw new Error('未找到用户')
return user
}
async createUser(user: CreateUserInput): Promise<User> {
this.users.push(user)
return user
}
}

存储库(Repository)#

对于小型项目,你可能在会直接在 Controller 或者 Service 中操作数据库,对于大型项目,为了项目的分层更清晰,TieJS 推荐抽象一层 存储库(Repository) 来操作数据库,通常你会在 Service 中调用 Repository。

import { Injectable } from '@tiejs/common'
import { InjectRepository } from '@tiejs/typeorm'
import { Repository } from 'typeorm'
import { User } from '@entity/user.entity'
@Injectable()
export class UserRepository {
@InjectRepository(User)
private userRepository: Repository<User>
async findAll(): Promise<User[]> {
return await this.userRepository.find()
}
}

插件(Plugin)#

中间件也是 Provider,详细使用方法请看 插件

import { Injectable, IPlugin } from '@tiejs/common'
@Injectable()
export default class SomePlugin implements IPlugin {
async appDidReady() {
console.log('app ready')
}
}

中间件(Middleware)#

中间件也是 Provider,详细使用方法请看 中间件

import { Injectable } from '@tiejs/common'
@Injectable()
export default class LoggerMiddleware {
async use(ctx: any, next: any) {
console.log('request URL:', ctx.url)
await next()
}
}

工具(Util)#

通常一些和业务逻辑无关的工具方法,可以抽象为工具 Provider,使用方法和服务(Service)一致。

import { Injectable } from '@tiejs/common'
@Injectable()
export class DateUtil {
getTimestamp() {
return Date.now()
}
getHours() {
return new Date().getHours()
}
getDate() {
return new Date().getDate()
}
}