【问题标题】:Nest.js project with TypeORM Active Record implementation带有 TypeORM 活动记录实现的 Nest.js 项目
【发布时间】:2019-01-30 08:08:35
【问题描述】:

我正在尝试使用 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);
  }
}

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

【问题讨论】:

    标签: nestjs typeorm


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,我以为这不是非常“嵌套”的方式。但是我确实喜欢 Active Record 方法,这似乎是这样做的唯一方法。我很想看到一些像这样实现的代码示例。文档似乎只显示 Active Record 实体类型的静态方法:typeorm.io/#/active-record-data-mapper
    • 更“嵌套”的方法是遵循数据映射器模式,因此您可以在存储库上定义范围,而不是模型本身,然后在测试中模拟存储库的功能.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多