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 并包含静态类型特定方法的父类继承