首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使属性依赖注入在React项目中工作

无法使属性依赖注入在React项目中工作
EN

Stack Overflow用户
提问于 2020-12-16 08:04:00
回答 1查看 544关注 0票数 2

我需要使用类似于C#或Java的语法方式为react项目注入一些真正基本的依赖项。通过道具使用上下文或注入不是一种选择。到目前为止,我尝试了三种解决方案:

然而,这些解决方案都不起作用,如果存在某种配置问题,就会引发问题。

使用倒装/反编译的-React Decorator/ Rect.DI

SomeService.ts

代码语言:javascript
复制
import { inject, injectable } from "inversify";
import { TYPES, ITokenProvider, IFileService } from "../injectables";
import { lazyInject, DIContainer } from "../inversify.config";

export class SomeService {

    @inject(TYPES.ITokenProvider) private tokenProvider!: ITokenProvider;      //Inversify
    //@lazyInject(TYPES.ITokenProvider) private tokenProvider!: ITokenProvider;//Inversify-r-d
    //@Inject tokenProvider!: TokenProvider;                                   //react-di
     (...)
}

inversify.config.ts

代码语言:javascript
复制
import "reflect-metadata";
import { Container } from "inversify";
import getDecorators from "inversify-inject-decorators";

import { TYPES, ITokenProvider, } from "./injectables";
import { TokenProvider } from "./Services/TokenProvider"


const DIContainer = new Container();
DIContainer.bind<ITokenProvider>(TYPES.ITokenProvider).toConstructor(TokenProvider);


const { lazyInject } = getDecorators(DIContainer, false);

export { DIContainer, lazyInject }

injectables.ts

代码语言:javascript
复制
export interface ITokenProvider {
    getSomeToken(): Promise<string>
}

TokenProvider.ts

代码语言:javascript
复制
import "reflect-metadata";
import * as microsoftTeams from "@microsoft/teams-js";

import { injectable } from "inversify";
import { ITokenProvider } from '../injectables';

@injectable()
export class TokenProvider implements ITokenProvider {

    public constructor() { }

    public async getSomeToken(): Promise<string> {
        (...)
    }
}

App.tsx (由react di代替inversify.config使用)

代码语言:javascript
复制
@Module({
    providers: [
        { provide: AccessTokenProvider, useClass: AccessTokenProvider },
    ]
})

误差

React DI和Inversify将解析依赖项,导致属性的未定义错误。倒装装饰器会导致以下错误:

代码语言:javascript
复制
TokenProvider.ts:8 Uncaught ReferenceError: Cannot access 'SomeService' before initialization
    at Module.SomeService (VM8 main.chunk.js:248)
    at Module../src/inversify.config.ts (inversify.config.ts:11)
   (...)

Config

tsconfig.json

代码语言:javascript
复制
{
  "include": [
    "src/*"
  ],
  "compilerOptions": {
    "target": "es5",
    "jsx": "react",
    "allowSyntheticDefaultImports": true,
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "types": [ "reflect-metadata" ]
  }
}

我还尝试在不同的类中移动"reflect-metadata"

EN

回答 1

Stack Overflow用户

发布于 2022-08-30 07:02:07

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65319360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档