标签: inversifyjs

Babel 7 + Inversify 4 + WebPack 4-@inject上的意外字符'@'

我有一个使用Inversify的打字稿Vue SPA项目。

我使用了awesome-typescript-loader来编译我的打字稿源代码。现在我想切换到Babel,但是当我编译我的应用程序webpack时会出现以下错误:

模块解析失败:意外字符'@'(38:25)您可能需要
适当的加载程序来处理此文件类型。
| _inherits(ReportService,_BaseService);
| >函数ReportService(@inject(TYPES.Urls)
|网址){
| var _this;
@ ./app/Ioc/container.ts 6:0-54 14:39-52
@ ./app/startup.ts

.babelrc

{
    "presets": [
        "@babel/env",
        "@babel/preset-typescript"
    ],
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true }],
        "@babel/proposal-class-properties",
        "@babel/proposal-object-rest-spread"
    ]
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "test/*": [ "test/*" ],
      "@/*": [ "app/*" ]
    },
    "lib": [ "es6", "dom" ], // es6 minimum required for Promise
    "target": "es6", // Required for vuetify
    "strict": …
Run Code Online (Sandbox Code Playgroud)

babel typescript webpack inversifyjs babel-loader

5
推荐指数
1
解决办法
1008
查看次数

为什么我的属性注入尝试除了未定义之外没有注入任何内容?

我有一个使用 inversify 的现有打字稿项目。我已经在我的 TYPES 中定义了一个记录器,TYPES.ILoggger当我直接从我的容器访问记录器时,它可以工作:

import {ILogger} from "./interfaces/ILogger";
import {TYPES} from "./interfaces/TYPES";
import container from "./kernel/inversify.config";

const loggerFromTheContainer: ILogger = container.get<ILogger>(TYPES.ILogger);
loggerFromTheContainer.info("I WILL LOG"); // this works
Run Code Online (Sandbox Code Playgroud)

所以我的设置应该没问题。

我不想直接访问容器,但我想使用属性注入。[InversifyJS' README提供了一个例子:

如果你喜欢它,你可以使用属性注入而不是构造函数注入,这样你就不必声明类构造函数:

@injectable()
class Ninja implements Warrior {
    @inject(TYPES.Weapon) private _katana: Weapon;
    @inject(TYPES.ThrowableWeapon) private _shuriken: ThrowableWeapon;
    public fight() { return this._katana.hit(); }
    public sneak() { return this._shuriken.throw(); }
}
Run Code Online (Sandbox Code Playgroud)

我试着遵循那个。

然而,当我尝试通过属性注入来注入记录器时,我突然undefined变成了一个记录器,我不知道为什么:

@injectable()
class ShouldHaveLogger {
    @inject(TYPES.ILogger) private logger: ILogger;

    constructor() {
        this.logger.info("Hello World"); // this.logger …
Run Code Online (Sandbox Code Playgroud)

typescript inversifyjs

5
推荐指数
1
解决办法
2174
查看次数

NestJS 在非模块文件中注入模块服务

我有一个用于视图渲染的函数文件,我想在这里使用 nestjs 模块服务。我的渲染文件是这样的。

export default {
  parse() { }
  render() { }
}
Run Code Online (Sandbox Code Playgroud)

所以要在这里使用模块服务,我尝试像这样注入。

import { Inject } from '@nestjs/common';
import { MemberService } from './member.service';

class SampleClass {
  constructor(@Inject('MemberService') private readonly memberService: MemberService) {}
}

// Creating class in here to use in functions
const sampleService = new SampleClass();

export default {
  parse() { }
  render() { }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在这里创建新类时出现错误“预期有 1 个参数但得到 0”

我的会员服务是这样的

@Injectable()
export class MemberService {
  constructor(@Inject(Constants.RelationshipMemberModel) private readonly relationshipMemberModel: typeof Model) {}
  login () {} …
Run Code Online (Sandbox Code Playgroud)

javascript dependency-injection typescript inversifyjs nestjs

5
推荐指数
1
解决办法
3815
查看次数

4
推荐指数
1
解决办法
2325
查看次数

InversifyJS - 注入服务来表达中间件

我正在使用 inversify、inversify-binding-decorators 和 inversify-express-utlis,并且在使用 express 中间件时遇到了问题。

我以这种方式调用我的中间件:

let server = new InversifyExpressServer(container);
...
server.setConfig((app) => {

  app.use(validateSession);

});
...
Run Code Online (Sandbox Code Playgroud)

这是我的 ioc 注册课程。请注意,这里我在请求范围内手动注册了 SessionContext

import DatabaseApi  from './../repositories/databaseApi';
import { Container, inject } from "inversify";
import TYPES from "./types";
import { autoProvide, makeProvideDecorator, makeFluentProvideDecorator } from "inversify-binding-decorators";
import { SessionContext } from './../services/session/sessionContext';
let container = new Container();
container.bind<SessionContext>(TYPES.SessionContext).to(SessionContext).inRequestScope();
let provide = makeProvideDecorator(container);
let fluentProvider = makeFluentProvideDecorator(container);

let provideNamed = (identifier: any, name: any) => {
  return fluentProvider(identifier)
    .whenTargetNamed(name)
    .done();
}; …
Run Code Online (Sandbox Code Playgroud)

javascript inversion-of-control inversifyjs

4
推荐指数
1
解决办法
1545
查看次数

如何将实例绑定到反转容器

我正在使用inversifyinversify-express-utils.

我有一个很平常的inversify/express设置。

  • 控制器
    • 服务
      • 一个模块
        • B模块

B module是一个如下所示的类:

import { injectable } from 'inversify';
import SpellCorrector from 'spelling-corrector';

@injectable()
export class SpellCorrectorFactory {
  private corrector: any;

  constructor() {
    this.corrector = new SpellCorrector();
    this.corrector.loadDictionary();
  }

  public correct = (text: string): string => this.corrector.correct(text);
}
Run Code Online (Sandbox Code Playgroud)

现在,这里的问题是,正如您在构造函数中看到的,我有这行代码:

this.corrector.loadDictionary()
Run Code Online (Sandbox Code Playgroud)

该行需要一秒钟多的时间来执行。所以基本上看起来实际的实例创建是在我为服务提供服务@inject时发生的 所以每次我发出请求时,都会执行 的构造函数,因此请求需要超过 1000 毫秒而不是低于 100 毫秒。BASpellCorrectorFactory

如何将此类绑定到 inversify,以便在绑定期间实例化该类,并且在A module我可以访问在应用程序启动时创建的实例,而不是在我向快速路径发送请求时?

提前致谢!

javascript express typescript inversifyjs

4
推荐指数
1
解决办法
7838
查看次数

初始化期间出错:找不到 serviceIdentifier 的匹配绑定:符号(LicencesService)

我在编译代码时遇到错误:找不到 serviceIdentifier: Symbol(LicencesService) 的匹配绑定 以下是与该问题相关的代码。问题在于 server.ts 文件上 HTTP 的构造函数,如何正确注入 LicensesService?

我的打字文件:-

const TYPES = {
  LicencesService:Symbol.for('LicencesService')
}
export { TYPES }
Run Code Online (Sandbox Code Playgroud)

我的 server.ts 文件:-

import { LogsRepository } from './repositories/logs'
 import { TelemetryRepository } from './repositories/telemetry'
 import { AdminRouter, AuthRouter, BotsRouter, ModulesRouter } from './routers'
 import { ContentRouter } from './routers/bots/content'
 import { ConverseRouter } from './routers/bots/converse'
 import { HintsRouter } from './routers/bots/hints'
 import { NLURouter } from './routers/bots/nlu'
 import { isDisabled } from './routers/conditionalMiddleware'
 import { InvalidExternalToken, PaymentRequiredError } …
Run Code Online (Sandbox Code Playgroud)

node.js express typescript reactjs inversifyjs

4
推荐指数
1
解决办法
2万
查看次数

InversifyJS:注入扩展非注入外部模块的类

需要有关Inversify相关实现的帮助.我正在创建一个从节点扩展EventEmitter的类.当我尝试使用反转时,它说EventEmitter不可注射.以下是示例代码

//接口

export interface ISubscriber {
Connect(callback: Function);
on(event: string, listener: Function): this;
emit(event: string, ...args: any[]): boolean;
}
Run Code Online (Sandbox Code Playgroud)

//类

import {EventEmitter} from 'events';


@injectable()
class Subscriber extends EventEmitter implements ISubscriber {
logProvider: SCLogging.ILogger;
public constructor(
    @inject(TYPES.ILogger) logProvider: SCLogging.ILogger,
    @inject(TYPES.IConfig) config: IConfig
) {
    super();
    //Some Implementation
}

public Connect(callback) {
//Some Implementation
}

public on(event: string, listener: Function): this {
    super.on(event, listener);
    return this;
}

public emit(event: string, ...args: any[]): boolean {
    return super.emit(event, ...args);
}
}
export { …
Run Code Online (Sandbox Code Playgroud)

inversifyjs

3
推荐指数
1
解决办法
823
查看次数

expressjs 反转控制器中间件错误

我正在使用 nodejs、express 和 inversify 构建一个非常小的 rest api。

这是我的工作代码:

索引.ts

 const container = new Container();
 container.bind<interfaces.Controller>(Types.Controller)
          .to(MyController)
          .whenTargetNamed(Targets.Controller.MyController);

 container.bind<Types.Service>(Types.Service)
          .to(MyService)
          .whenTargetNamed(Targets.Services.MyService);


 const server = new InversifyExpressServer(container); 
 const app = server.build();
 app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

mycontroller.ts

 @injectable()
 @controller('/api/test')
 export class MyController {

  constructor(@inject(Types.Service) 
                  @named(Targets.Service.MyService) 
                  private MyService: MyService) { }

  @httpGet('/')
  public getCompanies(req: Request, res: Response, next: any): Promise<any[]> 
  {
    console.log('getTestData');
    return this.MyService.fetchAll();
  }
}  
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常。当我想使用中间件来检查身份验证令牌时,问题就出现了。

authmiddleware.ts

function authMiddlewareFactory( 
{
  return (config: { role: string }) => 
  {
    return (req: Request, res: Response, next: any): void …
Run Code Online (Sandbox Code Playgroud)

rest node.js express inversifyjs

3
推荐指数
1
解决办法
6066
查看次数

TypeError:Reflect.hasOwnMetadata不是一个函数

我正在尝试将反脚本与typescript和node.js结合使用。我当前使用的是Node.js版本6.9.1,打字稿版本2.6.2和ECMAScript6。当我尝试运行node.js应用程序时,我一直收到以下错误,“ TypeError:Reflect.hasOwnMetadata不是一个函数”。

根据我在网上找到的文档,通过在inversify.config.js文件顶部添加导入“ reflect-matadata”,它似乎可以工作一段时间,但是现在问题又回来了。

在我的inversify.config.ts文件中,有以下代码从我的app.ts文件中调用:

export let initialize = async (): Promise<Container> => {
        var container = new Container();

        try {
                if (!Reflect.hasOwnMetadata("inversify:paramtypes", ClassToAddInjectableTo)) {
                        decorate(injectable(), ClassToAddInjectableTo);
                }

                ….

            container.bind<interfaces.Controller>(TYPE.Controller).to(MyController1).whenTargetNamed('MyController1');
            container.bind<interfaces.Controller>(TYPE.Controller).to(MyController2).whenTargetNamed('MyController2');
        } catch (ex) {
            throw ex;
        }
}
Run Code Online (Sandbox Code Playgroud)

此代码存在于app.ts中,它调用inversify.config.ts文件中的代码:

setup = async () => {
    try {
        let container: Container = await initialize();
        …..

    } catch (err){
        throw err;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题似乎在node_modules / inversify / lib / annotation / decorator_utils.js:22的以下行中:

if (Reflect.hasOwnMetadata(metadataKey, annotationTarget) === true) {
Run Code Online (Sandbox Code Playgroud)

在生成的inversify.config.js文件中,以下代码似乎在导入“ reflect-metadata”上方:

var …
Run Code Online (Sandbox Code Playgroud)

node.js typescript inversifyjs

3
推荐指数
2
解决办法
2885
查看次数