You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js项目中使用Inversify注入Prisma IO模块?

在Node.js中结合Inversify与Prisma实现依赖注入

步骤1:安装依赖

确保项目中已安装所需包:

npm install inversify reflect-metadata @prisma/client
npm install -D prisma typescript ts-node

步骤2:配置TypeScript编译选项

在tsconfig.json中启用装饰器相关配置:

{
  "compilerOptions": {
    "target": "ES6",
    "module": "CommonJS",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "strict": true
  }
}

步骤3:定义依赖标识

创建types.ts文件,用Inversify的Symbol.for定义PrismaClient的唯一标识:

import { Symbol } from "inversify";

export const TYPES = {
  PrismaClient: Symbol.for("PrismaClient"),
};

步骤4:绑定PrismaClient到Inversify容器

创建container.ts文件,初始化容器并绑定PrismaClient为单例:

import { Container } from "inversify";
import { PrismaClient } from "@prisma/client";
import { TYPES } from "./types";

const container = new Container();

// 绑定单例PrismaClient实例
container.bind<PrismaClient>(TYPES.PrismaClient).toConstantValue(new PrismaClient());

export { container };

步骤5:在服务类中注入PrismaClient

创建一个业务服务类,比如UserService.ts,使用@inject装饰器注入PrismaClient:

import { injectable, inject } from "inversify";
import { PrismaClient } from "@prisma/client";
import { TYPES } from "./types";

@injectable()
export class UserService {
  private prisma: PrismaClient;

  constructor(@inject(TYPES.PrismaClient) prisma: PrismaClient) {
    this.prisma = prisma;
  }

  async getUserById(id: number) {
    return this.prisma.user.findUnique({ where: { id } });
  }

  async createUser(data: { name: string; email: string }) {
    return this.prisma.user.create({ data });
  }
}

步骤6:注册服务并使用

在入口文件(比如index.ts)中,注册服务到容器并使用:

import "reflect-metadata"; // 必须在所有装饰器使用前引入
import { container } from "./container";
import { UserService } from "./UserService";
import { TYPES } from "./types";

// 绑定UserService到容器
container.bind<UserService>(UserService).toSelf();

// 获取服务实例并调用方法
async function main() {
  const userService = container.get<UserService>(UserService);
  const newUser = await userService.createUser({
    name: "John Doe",
    email: "john@example.com",
  });
  console.log("Created user:", newUser);

  const user = await userService.getUserById(newUser.id);
  console.log("Fetched user:", user);
}

main().catch(console.error);

注意事项

  • 必须在代码最顶部引入reflect-metadata,否则Inversify的装饰器无法正常工作。
  • PrismaClient以单例形式绑定,避免创建过多数据库连接实例。
  • 若需要自定义PrismaClient配置(如日志、连接池),可在实例化时传入配置参数。

内容的提问来源于stack exchange,提问作者Ramazan Koldaş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:07:50