DEV Community

Krishna Kurtakoti
Krishna Kurtakoti

Posted on • Edited on

Dependency Injection in Nest.js

Dependency Injection

We have a project module and a bid module.
The project record(in MongoDB) is created by user of type "Sme" and
the bid record(in MongoDB) is created by user of type "Sponsor".
A Sponsor can bid for a project created by Sme.

1.The Project module is shown below with the path
src/sme-project/sme-project.module.ts.
The BidDetailsModule is included within this SmeProjectModule.
Note here that the SmeProjectService class is exported from this module and can be injected in other modules.
The SmeProjectService class is injected in the BidDetailsService class in the later part.
Code (Part-I):

// hidden setup JavaScript code goes in this preamble area const hiddenVar = 42 import { Module } from "@nestjs/common"; import { SmeProjectController } from "./sme-project.controller"; import { SmeProjectService } from "./sme-project.service"; import { MongooseModule } from "@nestjs/mongoose"; import { SmeProjectSchema } from "./objects/sme-project.schema"; import { ProjectComplexityModule } from "../project-complexity/project-complexity.module"; import { PracticeAreaModule } from "../practice-area/practice-area.module"; import { MilestoneModule } from "../milestone/milestone.module"; import { RemarksModule } from "../remarks/remarks.module"; import { BidDetailsModule } from "../bid-details/bid-details.module"; import { ProjectStatusModule } from "../project-status/project-status.module"; @Module({ imports: [ MongooseModule.forFeature([ { name: "SmeProject", schema: SmeProjectSchema }, ]), ProjectComplexityModule, PracticeAreaModule, MilestoneModule, ProjectStatusModule, RemarksModule, BidDetailsModule ], exports: [SmeProjectService], controllers: [SmeProjectController], providers: [SmeProjectService], }) export class SmeProjectModule {}

The BidDetailsModule module is shown below with the path src/bid-details/bid-details.module.ts.
Code(Part-II):
// hidden setup JavaScript code goes in this preamble area const hiddenVar = 42 import { Module, forwardRef } from '@nestjs/common'; import { BidDetailsController } from './bid-details.controller'; import { BidDetailsService } from './bid-details.service'; import { BidDetailsSchema } from './objects/bid-details.schema'; import { MongooseModule } from '@nestjs/mongoose'; import { WalletTransactionsService } from '../wallet-transactions/wallet-transactions.service'; import { WalletTransactionsModule } from '../wallet-transactions/wallet-transactions.module'; import { WalletTransactionsSchema } from '../wallet-transactions/objects/wallet-transactions.schema'; import { UsersModule } from '../users/users.module'; import { UserSchema } from '../users/objects/user.schema'; import { SmeProjectSchema } from '../sme-project/objects/sme-project.schema'; import { SmeProjectModule } from '../sme-project/sme-project.module'; import { SmeProjectService } from '../sme-project/sme-project.service'; @Module({ imports: [ MongooseModule.forFeature([ { name: "BidDetails", schema: BidDetailsSchema }, { name: "WalletTransaction", schema: WalletTransactionsSchema }, { name: "User", schema: UserSchema }, { name: "SmeProject", schema: SmeProjectSchema }, ]), WalletTransactionsModule, forwardRef(() => UsersModule), forwardRef(() => SmeProjectModule), //SmeProjectModule, ], exports: [BidDetailsService, WalletTransactionsService], controllers: [BidDetailsController], providers: [BidDetailsService, WalletTransactionsService,SmeProjectService] }) export class BidDetailsModule {}

We need to inject the SmeProjectService class in the BidDetailsService class in the constructor as shown below.So we have imported SmeProjectModule inside BidDetailsModule.We have also included the SmeProjectService in the providers of this BidDetailsModule.
Since BidDetailsModule is already included in the SmeProjectModule Code(Part-I),importing it directly will lead to circular dependency.
We use forwardRef(() => SmeProjectModule) to solve this in place of just SmeProjectModule.

The BidDetailsService class is shown below with the path src/bid-details/bid-details.service.ts.
Code(Part-III):

// hidden setup JavaScript code goes in this preamble area const hiddenVar = 42 // visible, reader-editable JavaScript code goes here import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from "mongoose"; import { BaseService } from '../common/base/base.service'; import { IBidDetails } from './objects/bid-details.schema'; import { CreateWalletTransactionDto } from '../wallet-transactions/objects/wallet-transactions.dto'; import { TRANSACTION_TYPE, USER_TYPES } from '../common/constants/enum'; import { WalletTransactionsService } from '../wallet-transactions/wallet-transactions.service'; import { UsersService } from '../users/users.service'; import { EXISTS, TOKENS_FOR_SUBMISSION_ERROR } from '../common/constants/string'; import { IUser } from '../users/objects/user.schema'; import { SmeProjectService } from '../sme-project/sme-project.service'; @Injectable() export class BidDetailsService extends BaseService { constructor( @InjectModel("BidDetails") private readonly bidDetailsModel: Model, private walletTransactionsService: WalletTransactionsService, private usersService: UsersService, private smeProjectService: SmeProjectService, ) { super(bidDetailsModel); } //Details of code... }

This is a sample of how dependencies can be worked in Nest.js.
My Github Profile for code:
Please see the develop branch in my repo.
[Link]https://github.com/krishnakurtakoti/nestTwo

Top comments (0)