我来自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 实例化?如果不是这种情况,我们不是最好的情况。我看到两种不同的解决方案:
- 尝试通过 inversify 容器实例化
SummaryApp
(我不是 Angular 专家,所以我不知道如何完成这样的壮举( - 使用@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