簡體   English   中英

使用 typescript 進行依賴注入並使用類進行表達

[英]Dependency Injection with typescript and express using classes

我們如何在路由文件中使用依賴注入的概念並在服務器文件中添加?

我嘗試在我的節點項目中使用依賴注入,但我不認為我走在正確的道路上。 我正在嘗試將我的UserService注入到我的AppRouter中。 我的注冊方法以前是static但我將其更改為public方法,因為static成員不允許我注入依賴項。

首先this.userService.UserRegistrationService向我顯示錯誤undefined 請提出正確的方法,因為我是新來表達和節點的。

路由文件

import express from 'express';
import bodyParser = require('body-parser');
import { API } from ".././utilities/api";
import UserService from '../api/services/UserService';
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
import validationMw from '../api/middlewares/request_validation';
import UserDao from '../api/requests/userDto';
let cors = require('cors');
//let bodyParser = require('body-parser');
 
class AppRouter {

  private userService: UserService;
  public router: express.Router;
  public userObj: any;

  constructor(userService: UserService) {
    this.router = express();
    this.router.use(cors());
    this.AddMiddlewares();
    this.AddRoutes();
   
    this.userService =  userService;
  }

  // Add all middlewares here that will get request before routes.
  AddMiddlewares(): void { //  Used to parse req.body into json object

    this.router.use(bodyParser.json());
    this.router.use(bodyParser.urlencoded({ extended: false }));
    //this.router.use(LogsService.LogRequest);
  }

  AddRoutes(): void {
    console.log(API.RegistrationEmployee);
    this.router.post(API.RegistrationEmployee, this.userService.UserRegistrationService);
  }
}

export default new AppRouter(new UserService).router;

用戶服務 Class

import { Request, Response } from "express-serve-static-core";
import { isNullOrUndefined, isNull } from "util";
import { logger } from "../../utilities/logger";
import UserController from "../controllers/userController";
import { ProjectConstants, ErrorCodes } from "../../utilities/config";
import {
  ReasonPhrases,
  StatusCodes,
  getReasonPhrase,
  getStatusCode,
} from "http-status-codes";
import ResponseService from "../services/ResponseService";

export default class UserService {

  private userController: UserController;
  
  constructor(userController?: UserController) {
      this.userController = userController;
  }  

  public async UserRegistrationService(req: Request, res: Response) {
    console.log(434);
    // UtilityMethods.ConsoleLog("UserRegisterService - BODY", req.body);
    logger.info("UserRegistration- function call " + JSON.stringify(req.body));
    
    await this.userController.registration(req.body)
      .then((data: any) => {
        // UtilityMethods.ConsoleJSON("03 GetCategoryService", data);
        ResponseService.SendSucessResponse(req, res, data, ErrorCodes.OK);
      })
      .catch(function (err: any) {
        ResponseService.SendErrorResponse(req, res, err);
      });
  }
}

您已經設計了其中一些類以在其構造函數中獲取依賴項,但您需要確保在調用new提供了依賴項。

您在這一行new AppRouter(new UserService).router中的UserService之后缺少括號。 它需要是new UserService()才能修復語法錯誤。 但是您仍然會遇到運行時錯誤。

這里的代碼塊是一個問題:

class UserService {
    private userController: UserController;

    constructor(userController?: UserController) {
        this.userController = userController;
    }

private userController: UserController意味着this.userController必須始終是UserController 但是constructor(userController?: UserController)意味着您可以使用或不使用UserController來構造它。 如果你在沒有 arguments 的情況下調用new UserService() ,那么this.userControllerundefined的,這是不行的。 如果this.userControllerundefined ,執行這樣的操作await this.userController.registration(req.body)會給你錯誤。

為了讓您的UserService工作,您必須向構造函數提供一個UserController參數。

我們更改constructor ,使其不再是可選的:

    constructor(userController: UserController) {

但是現在我們在創建AppRouter的那一行遇到了問題,因為您需要提供一個UserController

這不起作用:

export default new AppRouter(new UserService()).router;

我不確定您如何實例化UserController (它是否需要任何 arguments?),所以這可能不對。 但它應該看起來像這樣:

const userController = new UserController();

export default new AppRouter(new UserService(userController)).router;

暫無
暫無

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

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