什么是装饰器聚合
在 Nest.js 中,装饰器聚合(Decorator composition)是一种技术,通过将多个装饰器组合在一起形成一个装饰器链,以便在一个项(类、方法或参数)上应用多个装饰器的功能。装饰器聚合可以使代码更模块化、可复用,并且提高了装饰器的灵活性。
通过装饰器聚合,可以按照一定的顺序应用多个装饰器,每个装饰器都可以在不影响其他装饰器功能的情况下添加、修改或扩展特定项的行为。
装饰器聚合有什么用
复用性: 通过装饰器聚合,你可以将不同的装饰器组合在一起,形成一个可重复使用的装饰器链。这样,你可以定义一系列通用的装饰器,并在需要时根据需求组合它们。
模块化: 装饰器聚合使得装饰器可以更细粒度地应用于不同的部分。通过将多个装饰器应用于一个项,你可以将不同的关注点和功能分离。每个装饰器可以专注于一个特定的任务,从而提高代码的可读性和可维护性。
灵活性: 装饰器聚合允许你按照一定的顺序应用装饰器,以满足特定的需求。你可以定义不同的装饰器链,每个链上的装饰器顺序不同,可以根据需求轻松定制项的行为。
扩展性: 装饰器聚合允许你轻松地扩展已经存在的装饰器功能。如果你想要对一个项的行为进行修改或添加额外功能,只需在聚合装饰器链中添加新的装饰器即可,而不需要修改已有的装饰器。
项目中使用
在昨天的Guard案例中,我们拿身份校验这个例子来说,目前我们控制器身上已经绑定了3个装饰器,这个路由装饰器可以先不看,接下来,我们再为其绑定个管道
这个是一个将密码转化为number类型的管道,管道具体用法请看我之前写的管道验证那篇
至此我们的这个上传的路由身上已经绑定了好几个装饰器了,看着是不是很冗余
通过命令行创建一个装饰器
nest g d roleAuth import { UseGuards, UsePipes, applyDecorators } from '@nestjs/common'; import { AuthGuard } from '../auth/auth.guard'; import { Role } from '../role/role.decorator'; import { MengPipe } from '../meng/meng.pipe'; export const RoleAuth = (...args: string[]) => { return applyDecorators( Role(...args), UseGuards(AuthGuard), UsePipes(MengPipe) ) }
接着通过关键的applyDecorators方法,将这些装饰器聚合在一起,要注意一点,因为Guard(守卫)的权限比pipe管道,拦截器等要高,所以这俩的顺序,调了也无效,在其他场景中可能对于不同的顺序,产生的效果也不一样,这个跟实际需求相关了
回到controller,为其绑定上我们聚合后的装饰器,相对于刚刚那一大堆,是不是简化了许多,这样也符合模块化,我们将实现特定功能的不同类聚合在一起最后统一导出,封装成一个一个的模块,另外对于这个管道如果我们要做dto验证,可能不止这一个地方应用了,在其他模块中也使用了,我们又可以结合其他类的功能将其封装成其他装饰器这样也达到了复用效果
总结
装饰器聚合为 Nest.js 应用提供了更强大、更灵活的装饰器功能。通过合理地组织和组合装饰器,可以提高代码的可读性、可维护性,并使系统更加模块化和可定制。
使用的时候要注意一点:包中的装饰器不可组合,无法与函数正常工作!!!