如何在NestJS中为不同服务创建通用逻辑?以重复findAll方法为例
问题场景
以下两个服务中的private findAll()方法逻辑完全重复,如何创建通用实现来复用这部分逻辑?
book.service.ts
import { Injectable } from "@nestjs/common"; import { Book } from '../interfaces/book.interface' @Injectable() export class BooksService { private readonly books: Book[] = []; private create(book: Book) { console.log(book) this.books.push(book); } private findAll(): Book[] { return this.books; } }
buy.service.ts
import { Injectable } from "@nestjs/common"; import { Book } from '../interfaces/book.interface' @Injectable() export class BuyService { private readonly books: Book[] = []; private findAll(): Book[] { return this.books; } }
解决方案
可以通过抽象基类抽离通用逻辑,让业务服务继承该基类来复用代码,同时保留原有封装性。
步骤1:创建通用抽象基类
新建BaseBookService,把重复的findAll方法和共享的books属性移到这里,将访问修饰符改为protected,确保子类可访问、外部不可直接调用:
import { Book } from '../interfaces/book.interface'; export abstract class BaseBookService { protected readonly books: Book[] = []; protected findAll(): Book[] { return this.books; } }
步骤2:业务服务继承基类
修改原有服务,继承抽象基类后即可直接复用通用逻辑:
修改后的book.service.ts
import { Injectable } from "@nestjs/common"; import { BaseBookService } from './base-book.service'; import { Book } from '../interfaces/book.interface' @Injectable() export class BooksService extends BaseBookService { private create(book: Book) { console.log(book) this.books.push(book); // 直接访问基类的protected属性 } }
修改后的buy.service.ts
import { Injectable } from "@nestjs/common"; import { BaseBookService } from './base-book.service'; import { Book } from '../interfaces/book.interface' @Injectable() export class BuyService extends BaseBookService { // 无需重复实现findAll,直接复用基类逻辑 }
扩展:支持多类型实体的泛型基类
如果后续需要复用其他实体(如User、Order)的CRUD逻辑,可以把基类改成泛型抽象类,进一步提升通用性:
export abstract class BaseCrudService<T> { protected readonly items: T[] = []; protected findAll(): T[] { return this.items; } protected create(item: T) { this.items.push(item); } }
业务服务使用时指定泛型类型即可:
@Injectable() export class BooksService extends BaseCrudService<Book> { private createBook(book: Book) { console.log(book); this.create(book); // 复用基类的create方法 } }
内容的提问来源于stack exchange,提问作者Alpin Cleopatra
相关产品推荐
相关产品推荐

