DEV Community

Krishna Kurtakoti
Krishna Kurtakoti

Posted on • Edited on

2

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

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay