【问题标题】:NestJS Create Base CRUD ServiceNestJS 创建基础 CRUD 服务
【发布时间】:2018-12-05 23:00:14
【问题描述】:

我正在用 nestjs 编写我的第一个 REST API。

我有几个实体,我必须为其定义基本的 CRUD 操作。 我想知道是否有一种方法可以创建一个我可以使用的基本 crud 服务,以便不对所有实体重复相同的代码。 在这个 base-crud 服务中,我将拥有四个调用存储库的 CRUD 方法,以便实际执行与数据库相关的工作。

基本上我希望有一个BaseCrudService<T>,而不是有一个UserServiceextends BaseCrudService<UserEntity>。 这样我可以“覆盖”派生类中的方法来做额外的逻辑业务,而不是调用基方法来实际插入、删除等。

有可能吗?如果是这样,你打算怎么做?

【问题讨论】:

  • 您必须在控制器和服务上动态构造函数。 REST URL 中的参数可能是不可能的。也许您可以在服务器上创建某种工厂。干爽很好,但这可能比它的价值要多得多。我在 Angular 中减少了 DRY,因为我在组件上的代码变得复杂和混乱,这样我就可以拥有通用的 http 服务。因此,为了简单明了,我计划为我的应用程序的每个模块提供一个单独的 Nestjs 控制器和服务。
  • @Preston 感谢您的回复!是的,我了解控制器部分,但是服务和存储库呢?你认为这可能吗?我仍然会为每个控制器提供一项服务,但至少基本的 CRUD 操作将委托给基本的 CRUD 服务
  • 我所知道的唯一方法是为每种类型的服务使用特定的存储库,就像承诺中的 membersRepository 和 Members 一样。我认为没有办法让相同的服务也适用于另一个 repo 和模型。
  • 我明白了!感谢您的帮助:)

标签: nestjs


【解决方案1】:

按如下方式创建基础服务:

export class BaseCrudService<Entity extends BaseEntity> {

    constructor(
        public repository: Repository<Entity>,
    ) { }

    async insertAsync(entity: Entity): Promise<InsertResult> {
        return this.repository.insert(entity);
    }
    ...
}

然后让各个服务扩展该类:

@Injectable()
export class UserService extends BaseCrudService<UserEntity>{
  constructor(
    @InjectRepository(UserEntity)
    public repository: Repository<UserEntity>,
  ) {
    super(repository);
  }
}

Et-voilà 现在您已经完成了插入、删除、更新等操作。这适用于所有扩展类的服务。

按照这个逻辑,您可以轻松创建BaseCrudController

【讨论】:

  • 只是为了补充这个答案,如果你碰巧使用 MongoDB,这是我的BaseServicegist.github.com/nartc/c93716ecde5837896ffc30feb84c719d
  • 此外,如果您想将此想法扩展到控制器,我添加了扩展基本控制器的可能性。见github.com/nestjs/nest/pull/387
  • 太好了,我会编辑答案并包括你们的建议:)
  • 存储库的创建和插入功能很容易混淆......这个例子非常有用。
  • @robertmain 部分
【解决方案2】:

我已经构建了一个包,可以帮助创建 CRUD 服务和控制器而无需继承 https://www.npmjs.com/package/@nestjsx/crud

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多