倒置';像angular';s使用TS装饰器
今天,我将一个js electron项目切换到typescript,问自己是否有与angular的依赖注入等价的东西。由于Angular Universal似乎处于非常早期的状态,并且没有任何文档将其与electron而不是express一起使用,因此inversify似乎可以满足我的需要。还因为它比角度更轻,因为我只需要DI 我最终尝试创建一个decorator,该decorator的工作原理与Angular中的倒置';像angular';s使用TS装饰器,angular,typescript,dependency-injection,decorator,inversifyjs,Angular,Typescript,Dependency Injection,Decorator,Inversifyjs,今天,我将一个js electron项目切换到typescript,问自己是否有与angular的依赖注入等价的东西。由于Angular Universal似乎处于非常早期的状态,并且没有任何文档将其与electron而不是express一起使用,因此inversify似乎可以满足我的需要。还因为它比角度更轻,因为我只需要DI 我最终尝试创建一个decorator,该decorator的工作原理与Angular中的NgModuledecorator类似 从“electron”导入{app,Men
NgModule
decorator类似
从“electron”导入{app,Menu,ipcMain,BrowserWindow};
从“inversify”导入{Container};
从“core/database.service”导入{DatabaseService};
函数servermodule(数据:{providers:Array}){
//一些实例化声明数组类的代码
//如果我不需要推荐人,他们必须被退回吗?
让容器=新容器();
返回(目标:对象)=>{
for(数据提供者的常量服务){
container.bind(service.toSelf();
}
}
}
循环遍历提供者中的每个条目,并将其绑定到inversifys容器对象。这个函数我想使用如下。然后,用法将完全与angulars decorator中的用法相同
@servermodule({
声明:[
//其他一些类,可能可以注入DatabaseService
],
供应商:[
数据库服务
]
})
导出类AppModule{。。。
例如,DatabaseService
可以如下所示
@Component()
export class MyComponent {
constructor (@Inject(MyService) myService: MyService) {}
}
从'inversify'导入{injectable};
@可注射()
导出类数据库服务{。。。
并且应该以角度样式注射,例如
从'inversify'导入{inject};
从“./database.service”导入{DatabaseService};
导出类模型{
构造函数(@inject(DatabaseService)dbService:DatabaseService){}
}
我不确定inversify的容器。它的作用域是否仅限于decorator函数?将其用作
container = new Container({ autoBindInjectable: true });
如何正确地将其返回到AppModule
?在servermodule decorator中声明类是一个好主意吗
现在,我只得到关于tsc和electron执行的以下错误消息,但没有ts linting错误
App threw an error during load
Error: Cannot find module 'database.service'
另一个想法/问题是:如果我想在声明和提供者之外添加一个import属性,那么由decorator修改构造函数并导入这些类是一个好主意吗
谢谢!关于这个问题,半年前,我致力于为一个分层DI实现装饰函数,该DI看起来类似于角度DI,并将它们捆绑在一个组件中。使用它,您可以生成模块
fl模块({
导入:[AnotherModule]//导入其他模块
providers:[MyService]//将Injectables()添加到模块容器中
声明:[]//与提供程序相同,但立即创建实例
导出:[//将可注入()放在父容器中
})
导出类MyModule{}
另一个模块可能看起来像
@Component()
export class MyComponent {
constructor (@Inject(MyService) myService: MyService) {}
}
fl模块({
声明:[MyComponent]
})
导出类AnotherModule{}
组件可能看起来像
@Component()
export class MyComponent {
constructor (@Inject(MyService) myService: MyService) {}
}
注意服务。服务是在父模块中提供的,因此这是分层的