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



嗨,朋友们,你好吗?

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

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

问题是,当构造函数为空时,它工作得很好,但当取消签名以接收另一个参数时,TSYSRINGE抛出了一个exeception。

我真的觉得我错过了一些非常简单的东西,但我不知道是什么。你能帮我做这个吗?感谢

错误:

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

控制器

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);
}

服务

@injectable()
export default class ListProjectsServices {
constructor(
@inject('ProjectsRepository')
private ProjectsRepository: IProjectsRepository,
) {}
public async execute(): Promise<Projects[]> {
const ProjectsList = await this.ProjectsRepository.findAllProjects();
return ProjectsList;
}
}

容器-创建注入令牌


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

Repository-注意构造函数中的extra_details参数

添加后,问题出现


@EntityRepository(Projects)
export default class ProjectsRepository implements IProjectsRepository {
private ormRepository: Repository<Projects>;
constructor(extra_details?: object) {
this.ormRepository = getRepository(Projects);
}
[...]

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

import { container, delay } from 'tsyringe';
container.registerSingleton<IProjectsRepository>(
'ProjectsRepository',
delay(() => ProjectsRepository),
);

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

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

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

我们在这里遇到了同样的问题,我们不想在控制器中使用延迟函数,因为我们会破坏依赖注入原理。。。解决该问题的一种方法是导入您的";容器";文件转换为主项目文件,在我们的情况下称为";server.ts";并安装一个名为";反映元数据";。

server.ts:

import * as dotenv from 'dotenv';
dotenv.config();
import express from 'express';
import 'express-async-errors';
import 'reflect-metadata'; // here is reflect-metadata import!
import config from './config/application';
import './infra/container'; // here is container import!
import { errorHandler } from './infra/http/middlewares/errorHandler';
import useSwagger from './infra/http/middlewares/swagger';
import { routes } from './infra/http/routes';
import { morganMiddleware } from './infra/logging/morgan';
export const app = express();
app.use(morganMiddleware);
app.use(express.json());
app.use(`${config.prefix}/api`, routes);
app.use(`${config.prefix}`, express.static('public'));
useSwagger(`${config.prefix}/api/docs`, app);
app.all(`${config.prefix}`, (_, res) => res.redirect(`${config.prefix}/api/docs`));
app.use(errorHandler);

集装箱/索引:

import { container } from 'tsyringe';
import { RecurrenceNotificationUseCase } from '../../application/useCases/RecurrenceNotificationUseCase';
import { PubSubImplementation } from '../pubsub/PubSubImplementation';
container.registerSingleton('IPubSub', PubSubImplementation);
container.registerSingleton('IRecurrenceNotificationUseCase', RecurrenceNotificationUseCase);

最新更新