簡體   English   中英

tsyringe - 使用重載的構造函數注入依賴項

[英]tsyringe - Injecting a dependency with overloaded constuctor

嗨朋友你好嗎?

我正在嘗試做一些不同的事情,我不知道它是否偏離了概念本身,但它會幫助我以一種優雅的方式實現我想要做的事情。

我正在使用存儲庫模式,在實現中我想使用重載的構造函數並使用可選參數,基本上在需要時傳遞一些 adicional 信息。

問題是,當構造函數為空時它工作得很好,但是當更改簽名以接收更多參數時,TSYSRINGE 會拋出一個異常。

我真的認為我錯過了一些非常簡單的東西,但我不知道是什么。 你能幫我解決這個問題嗎? 謝謝

錯誤:

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

Controller

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 ormconfig.json 實體屬性中的錯誤。 確保路徑指向您的實體:

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

我們在這里遇到了同樣的問題,我們不想在 controller 中使用延遲 function 因為我們會破壞依賴注入原則......解決問題的一種方法是將“容器”文件導入主項目文件,在我們的例子中稱為“server.ts”並安裝一個名為“reflect-metadata”的庫。

服務器.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);

容器/index.ts:

import { container } from 'tsyringe';
import { RecurrenceNotificationUseCase } from '../../application/useCases/RecurrenceNotificationUseCase';
import { PubSubImplementation } from '../pubsub/PubSubImplementation';

container.registerSingleton('IPubSub', PubSubImplementation);
container.registerSingleton('IRecurrenceNotificationUseCase', RecurrenceNotificationUseCase);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM