typescript TypeDI注入每个请求Db连接

5fjcxozz  于 2023-05-08  发布在  TypeScript
关注(0)|答案(2)|浏览(151)

我目前正在尝试用typedi实现一个服务库,我需要根据请求注入数据库连接,因为我有一个单一的api后端到多个域和多个数据库,所以我在请求时选择数据库,基于vhost。
目前我正在使用routing-controllers,我所有的服务类都有一个.initPrisma函数,我调用它来初始化,它工作正常,我目前正在做这样的事情:

@Service()
@JsonController()
export class ExampleController {
   constructor(private myExampleService: ExampleController);

   @Get("/example-endpoint")
   async myExampleEndpoint(@Req() request: any){
      const prisma = myPrismaFactory.getPrisma(req.request('host'));
      return this.myExampleService.initPrisma(prisma).getExampleJsonFromDb();
   }
}
@Service()
export default ExampleService {
   constructor(private prisma: PrismaService){}
   async getExampleJsonFromDb(){
      return this.prisma.myExampleTable.findFirst();
   }
}

@Service()
@JsonController()
export class ExampleController {
   constructor(private myExampleService: ExampleController);

   @Get("/example-endpoint")
   async myExampleEndpoint(@Req() request: any){
      const prisma = myPrismaFactory.getPrisma(req.request('host'));
      Container.set(PrismaService, prisma); // will this be thread safe ? 
      return this.myExampleService.getExampleJsonFromDb(); // will this be thread safe ? 
   }
}

我的问题是,这会使用正确的prisma示例吗?或者如果我有两个请求并行发送到具有不同域的同一个端点,因此有不同的prisma示例,那么就有可能混合查询?
或者,有没有更好的方法来注入这种依赖性?
先谢谢你了。

7gcisfzg

7gcisfzg1#

我做了些测试,似乎无法刷新注入的变量.

export const AuthUserToken = new Token<AuthUser>("AuthUser");

export class AuthService {
  @Inject(AuthUserToken)
  public user!: AuthUser;
}

然后进行单元测试以确认:

describe("AuthService", () => {
  const users: AuthUsers[] = [...Array(2).keys()].map((idx) => ({
    id: idx,
    name: `User ${idx}`,
  }));

  it("should return the right users", async () => {
    await Promise.all(
      users.map(async (user) => {
        Container.set(AuthUserToken, user);
        const authService = Container.get(AuthService);
        expect(authService.user.id).toBe(usuario.id); // always returns id 0, due to the singleton I supose. 
      })
    );
  });
});

我将尝试使用限定作用域的容器来实现这一点。我想这会有内存损失,但可能是一个解决方案。

cnwbcb6i

cnwbcb6i2#

解决后,限定作用域的容器工作。

describe("AuthService", () => {
  const users: AuthUsers[] = [...Array(2).keys()].map((idx) => ({
    id: idx,
    name: `User ${idx}`,
  }));

  it("should return the right users", async () => {
    await Promise.all(
      users.map(async (user) => {
        const scopedContainer = Container.of(`Usuario ${user.id}`);
        scopedContainer.set(AuthUserToken, user);
        const authService = scopedContainer.get(AuthService);
        expect(authService.user.id).toBe(usuario.id);
      })
    );
  });
});

相关问题