具有TypeORM Active Record实现的Nest.js项目

时间:2018-08-23 21:14:42

标签: nestjs typeorm

我正在尝试使用Nest.js和TypeORM构建一个项目。我喜欢TypeORM中的Active Record approach

我使用一些静态帮助器方法如下定义一个实体:

export class Book extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  description: string;

  static async createNew(attributes: BookDto): Promise<Book> {
    const entity = new Book();
    entity.name = attributes.name;
    entity.description = attributes.description;

    return entity.save();
  }

  static async findByName(name: string): Promise<Book> {
    return Book.findOne({
      where: { name },
    });
  }
}

我正在尝试按照Nest文档中的模式将其注入到我的服务中:

@Injectable()
export class BookService {
  constructor(
    @InjectRepository(Book)
    private readonly bookRepository: Repository<Book>,
  ) {}

  async create(bookAttrs: BookDto): Promise<Book> {
    return Book.createNew(bookAttrs);
  }
}

但是,正如您在我的服务中看到的那样,我仅使用静态方法。在这种情况下,我是否甚至需要注入依赖项?我应该遵循更好的模式吗?

1 个答案:

答案 0 :(得分:3)

如果您采用这种方法,则无需在服务中注入Repository,甚至不必在功能模块中导入TypeOrmModule.forFeature([User]),因为不注入任何与TypeOrm相关的东西,因为您正在使用可在任何地方使用的(全局)静态方法。

但是,我不建议您这样做,最重要的原因是测试: Nest为您提供了一种在测试中模拟依赖关系的便捷方法。这仅是可能的,因为您在模块中声明了依赖项,并且注入器决定了将要使用的实际实现。当您通过使用静态方法来隐式依赖时,要在单元测试和集成测试中模拟它们确实非常困难,如果要访问数据库,肯定要这样做。

除了测试之外,当您可以从任何地方进行静态访问时,您的依赖项可能会变得混乱。在模块中具有声明性依赖关系对于保持代码干净非常有用。