nestjs将一个模块分为3层,通过module将controller、service组合成一个可访问的模块,controller负责路由映射,service负责对接dao&entity。controller和service也可以注入到其他module中使用。
如果controller注入一个service,则所属的所有module都必须注入controller使用到的service!!一般类加载异常都是因为其他module注入了另外的controller但没注入controller依赖的service。
同理,如果service注入一个dao&entity,则所属的所有controller都必须在所属的module注入相应的dao&entity!!这个依赖关系是间接的更加隐蔽,例如App module注入了一个user的controller,那么需要注入user的service、dao&entity。
类加载异常定位方法
- 检查接口对应controller的service是否已注入到controller所属的module
- 检查service的dao&entity是否已注入到controller所属的module
- 检查依赖链是否有环
规范
- 推荐module之间相互import,不容易出错。通常为路由module注入到app module
- controller使用其他module的service时,注意service是否为纯service(无依赖),如果不纯则需要添加依赖到所属module。(此类情况建议将工具类的service和curd的service分开)
- 不要将工具性的service和curd的service实现到一个service中
- controller使用其他module的service时,尽量是这个service是纯的。