You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:50:25