代码之家  ›  专栏  ›  技术社区  ›  rhlsthrm

带有TypeORM活动记录实现的Nest.js项目

  •  2
  • rhlsthrm  · 技术社区  · 6 年前

    我试图用Nest.js和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 },
        });
      }
    }
    

    我正试图按照嵌套文档中的模式将其注入到我的服务中:

    @Injectable()
    export class BookService {
      constructor(
        @InjectRepository(Book)
        private readonly bookRepository: Repository<Book>,
      ) {}
    
      async create(bookAttrs: BookDto): Promise<Book> {
        return Book.createNew(bookAttrs);
      }
    }
    

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

    1 回复  |  直到 5 年前
        1
  •  4
  •   Kim Kern    6 年前

    如果你遵循这种方法,你不需要注入 Repository 为您服务,您甚至不必导入 TypeOrmModule.forFeature([User]) 在功能模块中,因为您使用的(全局)静态方法可以在任何地方使用,所以没有注入任何与TypeOrm相关的内容。

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

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

    推荐文章