在模块之间使用存储库

问题描述 投票:0回答:1

我是 NestJS 新手,正在使用 NestJS 和 Sequelize 开发应用程序。我想跨不同模块共享属于特定实体的存储库。 我有

users
instituteAcademics
模块,比如说,当我想创建一个
institute
时,我想验证用户详细信息,这是一个非常简单的用例。所以我需要
users
模块中
instituteAcademics
存储库的引用,这样我就可以在相关处理程序中查询。

以下是不同文件的代码:

instituteAcademics.module.ts

const repositories: Provider[] = [InstitutesRepository];
const controllers = [InstitutesController, StudentsController];
const entities = [Institutes, InstituteLevels, Students, StudentEnrollments];
const handlers: Provider[] = [
  GetInstitutesHandler,
  GetStudentDetailsHandler,
  GetStudentsListHandler,
  CreateStudentHandler,
  CreateInstituteHandler,
];

@Module({
  imports: [UsersModule, CqrsModule, SequelizeModule.forFeature([...entities])],
  controllers,
  providers: [...repositories, ...handlers],
  exports: [],
})
export class InstituteAcademicsModule {}

users.module.ts

const repositories: Provider[] = [UsersRepository];
const entities = [Users, UserAddresses, UserContacts];
const controllers = [UsersController];
const handlers: Provider[] = [GetUsersHandler, CreateUserHandler];

@Module({
  imports: [CqrsModule, SequelizeModule.forFeature([...entities])],
  controllers,
  providers: [...handlers, ...repositories],
  exports: [SequelizeModule],
})
export class UsersModule {}

如果您观察到我已经导出了

SequelizeModule
,根据我对link

的理解

users.repository.ts

@Injectable()
export class UsersRepository {
  constructor(
    @InjectModel(Users)
    private userModel: typeof Users,
  ) {}

  async createUsers(users: UsersCreationAttributes[]): Promise<Users[]> {
    return this.userModel.bulkCreate(users);
  }

  async createUser(user: UsersCreationAttributes): Promise<Users> {
    return this.userModel.create(user);
  }

  async deleteUser(user: UsersCreationAttributes): Promise<any> {
    return this.userModel.destroy({ where: { _id: user._id } });
  }

  async findOne(firstName: string): Promise<Users | null> {
    return this.userModel.findOne({
      where: {
        first_name: firstName,
      },
    });
  }
}

我想使用下面的

userRepository
createInstitute.handler.ts
:

@Injectable()
@CommandHandler(CreateInstituteCommand)
@JoiSchemaValidationHandler(CreateInstituteCommand, createStudentCommandSchema)
export class CreateInstituteHandler
  implements ICommandHandler<CreateInstituteCommand>
{
  constructor(
    private userRepository: UsersRepository,
    private institutesRepository: InstitutesRepository,
  ) {}

  async execute(command: CreateInstituteCommand) {
    const userEntity = CreateInstituteMapper.toUserEntity(command.request);
    console.log(`CreateStudentHandler`, userEntity);
  }
}

我收到以下错误:

enter image description here

感谢任何帮助。谢谢!

nestjs sequelize-typescript
1个回答
0
投票

在此文件中

instituteAcademics.module.ts
您必须添加 UsersRepository 作为提供者并添加您的 Users 实体

    const repositories: Provider[] = [UsersRepository, InstitutesRepository];
    const entities = [Institutes, InstituteLevels, Students, StudentEnrollments, Users];

您可以实现的另一个选项存储库模式

repository.ts


    import { Model } from 'sequelize-typescript';
    
    export class Repository<T extends Model<T>> {
      constructor(protected model: ModelStatic<T>) {}
    }

users.repository.ts

    import { Users } from './users.entities'

    @Injectable()
    export class UsersRepository extends Repository<Users> {
      constructor() {
        super(Users);
      }
    
      //your custom methods here 
      async findAll(): Promise<Users> {
        return this.model.findAll();
      }
    }

institute-academics.module.ts

    import { UsersRepository } from './users.repository';
    
    @Module({
      imports: [/** some import module here **/],
      providers: [UsersRepository],
      exports: [UsersRepository],
    })
    export class InstitueAcademicsModule {}

然后只需在您的 AppModule 中导入 SequelizeModule

© www.soinside.com 2019 - 2024. All rights reserved.