tsyringe-使用重载构造函数注入依赖项

时间:2020-09-23 16:15:18

标签: javascript node.js typescript dependency-injection typeorm

嗨,你好吗?

我正在尝试做一些不同的事情,我不知道它是否与概念本身背道而驰,但这将帮助我以一种优雅的方式实现我想做的事情。

我正在使用存储库模式,在实现中,我想使用重载的构造函数并使用可选参数,基本上在需要时传递一些辅助信息。

问题是,当构造函数为空时,它工作得很好,但是当更改签名以接收更多参数时,TSYSRINGE会抛出一个执行。

我真的认为我缺少一些非常简单的东西,但是我不知道是什么。你能帮我这个忙吗?谢谢

错误:

template<class T>
struct Entity{};

Entity<A> entity_a;
Entity<B> entity_b;
Entity<C> entity_c;

entity_container c(entity_a, entity_b);

c.push_back(entity_c);

控制器

Array(
  [124] => Array
    (
        [0] => 140
        [1] => 101
        [2] => 107
        [3] => 116
        [4] => 100
    ) 
)
Array(
  [164] => Array
    (
        [0] => 108
        [1] => 111
        [2] => 124
        [3] => 87
        [4] => 278
   ) 
)
Array(
  [162] => Array
    (
        [0] => 6
        [1] => 79
        [2] => 3
    )
) 

服务

Array(
  [164] => Array
    (
        [0] => 108
        [1] => 111
        [2] => 124
        [3] => 87
        [4] => 278
   ) 
)
Array(
   [162] => Array
   (
        [0] => 6
        [1] => 79
        [2] => 3
   )
)  

容器-创建注射令牌

Error: Cannot inject the dependency at position #0 of "ListProjectsServices" constructor. Reason:
    TypeInfo not known for "ProjectsRepository"

存储库-注意构造函数中的extra_details参数

添加后,出现问题

export default class ProjectsController {
  public async index(request: Request, response: Response): Promise<void> {
    const listProjectsServices = container.resolve(ListProjectsServices);
    const projects = await listProjectsServices.execute();
    response.json(projects);
  }

1 个答案:

答案 0 :(得分:1)

今天我遇到了同样的问题。 阅读关于循环依赖的this文章。 它告诉我们使用从tsyringe导入的延迟函数。 在文章中,他告诉我们在构造函数内部使用延迟。 但是您和我一样,不是直接在注入中发送对象,而是注册的密钥。 然后,您必须在容器文件中使用延迟,在存储库对象周围尝试以下操作:

import { container, delay } from 'tsyringe';

container.registerSingleton<IProjectsRepository>(
  'ProjectsRepository',
  delay(() => ProjectsRepository),
);

插入所有依赖异步存储库的注入延迟

seo ormconfig.json中的entities属性中也可能是错误。 确保路径指向您的实体:

"entities": [
  "./src/modules/**/infra/typeorm/entities/*.ts"
],