gpt4 book ai didi

mongoose - 为服务扩展类时如何处理 NestJS 依赖注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 02:29:58 25 4
gpt4 key购买 nike

我正在尝试根据我的 ConfigService 中的值提供不同的服务.

我遇到的问题是注入(inject)的 Mongoose 模型在执行查询方法(例如 findOne())时不返回任何值。 (结果为 null )或 countDocuments() (结果为 0 )。

我的服务类定义如下:

    export class BaseService {
constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {}

createService(option: string) {
if (option === 'OTHER') {
return new OtherService(this.catModel);
} else if (option === 'ANOTHER') {
return new AnotherService(this.catModel);
} else {
return new BaseService(this.catModel);
}
}

async findOne(id: string): Promise<Cat> {
return await this.catModel.findOne({_id: id});
}

async count(): Promise<number> {
return await this.catModel.countDocuments();
}

testClass() {
console.log('BASE SERVICE CLASS USED');
}
}

@Injectable()
export class OtherService extends BaseService {
constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {
super(catModel);
}

testClass() {
console.log('OTHER SERVICE CLASS USED');
}
}

@Injectable()
export class AnotherService extends BaseService {
constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {
super(catModel);
}
testClass() {
console.log('ANOTHER SERVICE CLASS USED');
}
}

这使我可以从我的提供商那里获得正确的服务( testClass() 打印预期的字符串)。我的提供者如下所示:

    export const catProviders = [
{
provide: 'CatModelToken',
useFactory: (connection: Connection) => connection.model('CAT', CatSchema),
inject: ['DbConnectionToken'],
},
{
provide: 'BaseService',
useFactory: (ConfigService: ConfigService, connection: Connection) => {
const options = ConfigService.get('SERVICE_TYPE');
let model = connection.model('CAT', CatSchema);
return new BaseService(model).createService(options);
},
inject: [ConfigService, 'CatModelToken', 'DbConnectionToken'],
}
];

所以我的问题分为两部分:
  • 有没有更好的方法来处理正确类的创建和
    避免必须创建 BaseService唯一的例子
    来电目的createService() ?
  • 将 Mongoose 模型注入(inject)新创建的服务的正确方法是什么?

  • 我也不能使用 useClass文档中的示例,因为我需要能够注入(inject) ConfigService .

    最佳答案

    您可以通过使用工厂方法来解决这个问题,试试这个:

    确定服务“形状”的接口(interface):

    export interface IDatabaseService {
    findOne(id: string): Promise<Cat>;
    count(): Promise<number>;
    testClass(): void;
    }
    BaseService 必须实现该接口(interface):
    export class BaseService implements IDatabaseService {

    constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {}

    async findOne(id: string): Promise<Cat> {
    return await this.catModel.findOne({_id: id});
    }

    async count(): Promise<number> {
    return await this.catModel.countDocuments();
    }

    testClass() {
    console.log('BASE SERVICE CLASS USED');
    }
    }
    动态服务未注入(inject),因此它们不使用 @Injectable()装饰师:
    export class OtherService extends BaseService {

    constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {
    super(catModel);
    }

    testClass() {
    console.log('OTHER SERVICE CLASS USED');
    }
    }

    export class AnotherService extends BaseService {

    constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {
    super(catModel);
    }

    testClass() {
    console.log('ANOTHER SERVICE CLASS USED');
    }
    }
    工厂类是被注入(inject)的东西:
    @Injectable()
    export class DatabaseServiceFactory {

    constructor(@InjectModel('Cat') private readonly catModel: Model<Cat>) {}

    createService(name: string) : IDatabaseService {
    switch(name) {
    case 'other': return new OtherService(this.catModel);
    case 'another': return new AnotherService(this.catModel);
    default: throw new Error(`No service has been implemented for the name "${name}"`);
    }
    }
    }
    export const catProviders = [
    {
    provide: 'CatModelToken',
    useFactory: (connection: Connection) => connection.model('CAT', CatSchema),
    inject: ['DbConnectionToken'],
    },
    {
    provide: 'BaseService',
    useFactory: (ConfigService: ConfigService, connection: Connection, dbFactory: DatabaseServiceFactory) => {

    const options = ConfigService.get('SERVICE_TYPE');
    let model = connection.model('CAT', CatSchema);

    //return new BaseService(model).createService(options);
    return dbFactory.createService(options);
    },
    inject: [
    ConfigService,
    'CatModelToken',
    'DbConnectionToken',
    DatabaseServiceFactory
    ],
    }
    ];

    关于mongoose - 为服务扩展类时如何处理 NestJS 依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776882/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com