0

我正在用 inversify 练习 mikroorm。

我有TodoEntity

import { Entity, Property, PrimaryKey, EntityRepositoryType } from '@mikro-orm/core'
import { TodoRepository } from '../../repositories'


@Entity({tableName: 'todo'})
export class TodoEntity {

  // [EntityRepositoryType]?: TodoRepository;

  @PrimaryKey()
  id?: number

  @Property()
  title: string

  @Property()
  description: string

  constructor(title: string, description: string) {
    this.title = title
    this.description = description
  }
} 

这是自定义存储库TodoRepository

import { EntityRepository } from '@mikro-orm/mysql'
import { Repository } from '@mikro-orm/core'
import { TodoEntity } from '../models/entities'
import { injectable } from "inversify"


@injectable()
@Repository(TodoEntity)
export class TodoRepository extends EntityRepository<TodoEntity> {} 

我将注入repositoryservice通过

import { injectable, inject } from "inversify"
import { TodoRepository } from "../repositories"
import TYPES from "../../di/types"
import autoBind from "auto-bind";

@injectable()
export class TodoService {

  private todoRepository: TodoRepository

  constructor (@inject(TYPES.TodoRepository) todoRepository: TodoRepository) {
    this.todoRepository = todoRepository
    autoBind(this)
  }

  public async getTodos() {
    return await this.todoRepository.findAll()
  }
}

这是我的控制器

import { injectable, inject } from "inversify"
import { TodoService } from "../services/todoService"
import { Request, Response, NextFunction} from "express";
import TYPES from "../../di/types";
import autoBind from "auto-bind";

@injectable()
export class TodoController {

  todoService: TodoService

  constructor(@inject(TYPES.TodoService) todoService: TodoService) {
    this.todoService = todoService
    autoBind(this)
  }

  public async getAllTodos(req: Request, res: Response, next: NextFunction) {
    res.send(await this.todoService.getTodos())
  }
}

这是类型

const TYPES = {
  TodoRepository: Symbol.for("TodoRepository"),
  TodoService: Symbol.for("TodoService"),
  TodoController: Symbol.for("TodoController")
};

export default TYPES

容器

import { TodoRepository } from "../todos/repositories"
import { TodoService } from "../todos/services/todoService"
import { TodoController } from "../todos/controllers/todoController"
import { Container } from "inversify"
import TYPES from "./types"



const container = new Container();

container.bind<TodoController>(TYPES.TodoController).to(TodoController);
container.bind<TodoService>(TYPES.TodoService).to(TodoService);
container.bind<TodoRepository>(TYPES.TodoRepository).to(TodoRepository);


export { container }

如何将自定义存储库注入服务,我有一个错误说 Error: Missing required @injectable annotation in: SqlEntityRepository

但是当我没有包括repository唯一的 servicecontroller我试图测试转储时。DI 工作正常

我按照这个例子用 mikro orm 反转例子

但在他没有使用自定义回购的例子中,知道我可以从哪里开始解决这个问题吗?

4

1 回答 1

0

您应该能够使用 inversify 提供的装饰实用程序添加装饰器。

import { decorate, injectable } from "inversify";
import SomeClass from "some-module";

decorate(injectable(), SomeClass);
return SomeClass;

在这里阅读文档:https ://github.com/inversify/InversifyJS/blob/master/wiki/inheritance.md#what-c​​an-i-do-when-my-base-class-is-provided-by-a -第三方模块

还有一个全局 Container 选项skipBaseClassChecks将跳过@injectable对所有基类的检查。

于 2021-08-11T12:54:50.160 回答