反转组合根以进行构造函数注入



我来自c#背景。我是 Angular 6 的新手。我了解到 di 有类似于 ninject 的 lib。反转。我尝试在应用程序中使用它。

我确实配置了绑定和类型。

类型.ts

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

绑定.ts

import 'reflect-metadata';
import { Container } from "inversify"
import { TYPES } from "./TYPES"
import { IAppService } from "./services/IAppService"
import { AppService } from "./services/AppService"

const inversifyContainer = new Container();
inversifyContainer.bind<IAppService>(TYPES.IAppService).to(AppService).inSingletonScope();
export { inversifyContainer };

和我正在注入的类 应用程序服务服务

import { inject } from "inversify";
import { Component, OnInit } from '@angular/core';
import { AppModel } from './model/AppModel'
import { IAppService } from './services/IAppService';
import { TYPES } from "./TYPES";

@Component({
selector: 'summary-app',
templateUrl: './summary-app.component.html'
})
export class SummaryApp implements OnInit {
private _service: IAppService;
constructor(
@inject(TYPES.IAppService) service: IAppService,
) {
this._service = service;
}
}

模块.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppService } from "./services/AppService"
import { SummaryApp } from './summary-app.component';
@NgModule({
declarations: [
SummaryApp
],
imports: [
BrowserModule
],
providers: [
AppService
],
bootstrap: [SummaryApp]
})
export class AppModule {
}

编译成功。 但是我收到运行时错误无法解析摘要应用程序的所有参数

这意味着 inversify 无法解析依赖关系。 我看到许多人们使用服务定位器解决依赖关系的示例。但我感受到了它的反模式。我在哪里可以有反转容器的复合根?

SummaryApp是否通过 conainer 实例化?如果不是这种情况,我们不是最好的情况。我看到两种不同的解决方案:

  1. 尝试通过 inversify 容器实例化SummaryApp(我不是 Angular 专家,所以我不知道如何完成这样的壮举(
  2. 使用@lazyInject
import getDecorators from "inversify-inject-decorators";
import { container } from 'your-container-module';
const { lazyInject } = getDecorators(container); // Export your inversify container
@Component({
selector: 'summary-app',
templateUrl: './summary-app.component.html'
})
export class SummaryApp implements OnInit {
private _service: IAppService;
constructor(
@lazyInject(TYPES.IAppService) service: IAppService,
) {
this._service = service;
}
}

此修饰器使用代理执行对反转容器的调用。这应该有效,除非您的捆绑器在 inversify 放置代理后重新定义属性(有关更多详细信息,请参阅此问题(

这不是与Angular合作的方式,伙计。

很抱歉如此直接,但我建议您不要逆流而上,而是使用 Angular 中包含的非常完整的依赖层次结构系统而不是 Inversify。

https://angular.io/guide/dependency-injection

最新更新