Mongodb,Typegoose - 通用存储库模式

Posted

技术标签:

【中文标题】Mongodb,Typegoose - 通用存储库模式【英文标题】:Mongodb, Typegoose - generic repository pattern 【发布时间】:2020-10-17 07:33:27 【问题描述】:

@typegoose/typegoose": "^7.2.0"

有什么方法可以使用 typecirpt 和 typegoose 获得通用 CRUD 存储库? 特别是,如何让getModelForClass() 方法与泛型一起工作? 类似于从question 246 借来的这段代码。

如果是这样,我错过了什么?

import  prop, getModelForClass  from '@typegoose/typegoose';
import  AnyParamConstructor, ReturnModelType  from '@typegoose/typegoose/lib/types';

export class GenericCRUDService<T, U extends AnyParamConstructor<T> = AnyParamConstructor<T>> 
  dataModel: ReturnModelType<U, T>;

  constructor(cls: U) 
    this.dataModel = getModelForClass<T, U>(cls);
  

  public create(data: T) 
    this.dataModel.create(data);
  


export class Cat 
  @prop()
  public age: number;
  @prop()
  public color: string;


export class Dog 
  @prop()
  public isBarking: boolean;
  @prop()
  public race: string;

【问题讨论】:

【参考方案1】:

参考:typegoose/typegoose#303

如果你想要一个“管理器类”而不是真正的模型是通用的,这很简单,你只需要有正确的类型

我会建议编写这样的类:

// NodeJS: 14.4.0
// MongoDB: 4.2-bionic (Docker)
import  getModelForClass, prop, types, ReturnModelType, DocumentType  from "@typegoose/typegoose"; // @typegoose/typegoose@7.2.0
import * as mongoose from "mongoose"; // mongoose@5.9.18 @types/mongoose@5.7.27

export class GenericCRUDService<U extends types.AnyParamConstructor<any>> 
  public dataModel: ReturnModelType<U>;

  constructor(cls: U) 
    this.dataModel = getModelForClass(cls);
  

  public create(data: mongoose.CreateQuery<DocumentType<InstanceType<U>>>) 
    this.dataModel.create(data);
  


export class Cat 
  @prop()
  public age?: number;

  @prop()
  public color?: string;


export class Dog 
  @prop()
  public isBarking?: boolean;

  @prop()
  public race?: string;


(async () => 
  await mongoose.connect(`mongodb://localhost:27017/`,  useNewUrlParser: true, dbName: "verifyMASTER", useCreateIndex: true, useUnifiedTopology: true );

  const CatService = new GenericCRUDService(Cat);

  await CatService.create(); // with type support (since ~@types/mongoose@5.7.21)

  await mongoose.disconnect();
)();

(以旧示例为例,您的问题是,由于 7.1.0 删除了“不必要的”T 泛型)

【讨论】:

以上是关于Mongodb,Typegoose - 通用存储库模式的主要内容,如果未能解决你的问题,请参考以下文章

用于 rest api 的 typegoose/mongoose 日期格式

Mongoose / typegoose 根据开始和结束索引获取数组

从扩展 Typegoose 并包含静态类型特定方法的父类继承

94存储库之MongoDBmysql

如何在使用 Typegoose 获取数据时使用 class-transformer 序列化嵌套 js 响应?

使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合