尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

flat-server开发进阶:TypeScript装饰器与依赖注入的巧妙运用

flat-server开发进阶:TypeScript装饰器与依赖注入的巧妙运用 flat-server开发进阶TypeScript装饰器与依赖注入的巧妙运用【免费下载链接】flat-serverA Node.js server for the Agora Flat open source classroom.项目地址: https://gitcode.com/gh_mirrors/fl/flat-serverflat-server作为Agora Flat开源教室的Node.js后端服务其代码架构中广泛运用了TypeScript的装饰器与依赖注入技术实现了代码解耦与高效管理。本文将深入探讨这些高级特性在项目中的实际应用帮助开发者掌握企业级应用的设计模式。 装饰器简化API开发的利器在flat-server中装饰器被大量用于定义API接口通过元数据注入实现路由自动注册。核心装饰器定义在src/decorator/Controller.ts文件中其实现如下export const Controller RES, REQ( params: ControllerParams, ): ((target: ControllerStaticTypeRES, REQ) void) { const { path, method, auth, ipblock, skipAutoHandle, enable } params; return (target: ControllerStaticTypeRES, REQ): void { Reflect.defineMetadata(RouterMetadata.PATH, path, target); Reflect.defineMetadata(RouterMetadata.METHOD, method, target); Reflect.defineMetadata(RouterMetadata.AUTH, auth, target); Reflect.defineMetadata(RouterMetadata.IPBLOCK, ipblock || false, target); Reflect.defineMetadata(RouterMetadata.SKIP_AUTO_HANDLE, skipAutoHandle || false, target); Reflect.defineMetadata(RouterMetadata.ENABLE, enable ?? true, target); }; }; 装饰器的实际应用场景以房间创建接口为例通过Controller装饰器可以轻松定义API的路径、请求方法和权限要求Controller({ path: room/create/ordinary, method: post, auth: true, }) export class CreateOrdinary extends AbstractControllerRequestType, ResponseType { // 业务逻辑实现 }这种方式带来三大优势代码集中化接口定义与实现分离便于维护元数据驱动通过Reflect.defineMetadata存储的元数据可被框架自动扫描标准化统一的API定义方式降低团队协作成本项目中类似的装饰器应用还有用户绑定接口src/v1/controller/user/binding/Process.ts、云存储接口src/v1/controller/cloudStorage/list/index.ts等形成了一套完整的API开发规范。 依赖注入Service Locator模式实现flat-server采用Service Locator模式实现依赖注入核心代码位于src/v2/service-locator/service-locator.ts。这种设计模式通过服务定位器统一管理依赖实现了组件间的解耦。 Service Locator核心实现export class ServiceLocator { private registry: PartialServicesCreatorCatalog {}; private services: PartialServicesPendingCatalog {}; public static getInstance(): ServiceLocator { return ((global as any).__SERVICE_LOCATOR || new ServiceLocator()) as ServiceLocator; } public registerT extends ServiceID(name: T, serviceCreator: ServicesCreatorCatalog[T]): void { if (this.isRegistered(name)) { throw new Error(${name} is already registered); } this.registry[name] serviceCreator; } public requestServiceT extends ServiceID(name: T): ServicesCatalog[T] { if (this.services[name]) { return this.services[name] as ServicesCatalog[T]; } const creator this.registry[name]; if (creator) { return ((this.services[name] as any) creator()); } throw new Error(service ${name} is not registered); } } 依赖注入的应用实例在云存储功能中通过服务定位器获取OSS服务实例import { useOnceService } from ../../service-locator; export class CloudStorageUploadService { private oss useOnceService(oss, { region: config.region }); // 使用oss服务进行文件上传 public async uploadFile() { await this.oss.putObject(...); } }这种方式的优势在于延迟初始化服务在首次请求时才会被创建单例管理服务定位器确保每个服务只被实例化一次灵活替换通过注册不同的服务实现可以轻松切换底层实现项目中大量使用依赖注入的服务包括云存储服务src/v2/services/cloud-storage/upload.ts用户认证服务src/v2/services/user/auth.ts合规检查服务src/v2/services/compliance-text/ali-compliance-text.ts️ 最佳实践与应用技巧1️⃣ 装饰器与依赖注入的结合使用在实际开发中装饰器与依赖注入常常结合使用。例如在控制器中通过依赖注入获取服务实例Controller({ path: user/upload-avatar/finish, method: post, auth: true, }) export class UploadAvatarFinish extends AbstractController { private userService ServiceLocator.getInstance().requestService(user); async handle() { // 使用userService处理业务逻辑 await this.userService.updateAvatar(...); } }2️⃣ 服务注册与初始化服务需要在应用启动时注册flat-server在src/v2/tasks/init-service.ts中完成服务注册import { registerService } from ../service-locator; import { OSSService } from ../services/oss/ali-oss; // 注册OSS服务 registerService(oss, (params) new OSSService(params));3️⃣ 元数据的扩展应用除了路由信息装饰器还可以存储更多元数据如请求验证规则、日志级别等Controller({ path: room/update/periodic, method: post, auth: true, validate: { body: PeriodicUpdateSchema } }) export class UpdatePeriodic extends AbstractController { // 控制器实现 } 总结flat-server通过TypeScript装饰器和依赖注入技术构建了一个高内聚低耦合的后端架构。装饰器简化了API定义依赖注入实现了服务的灵活管理两者的结合使用使得代码更加清晰、可维护。这些技术不仅提升了开发效率也为系统的扩展和重构提供了便利。对于希望提升Node.js项目架构水平的开发者来说flat-server的这些实践值得深入学习和借鉴。通过src/decorator/Controller.ts和src/v2/service-locator/service-locator.ts这两个核心文件我们可以进一步探索flat-server中装饰器和依赖注入的更多高级应用为自己的项目带来启发。【免费下载链接】flat-serverA Node.js server for the Agora Flat open source classroom.项目地址: https://gitcode.com/gh_mirrors/fl/flat-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表