【发布时间】:2016-12-30 07:45:19
【问题描述】:
我目前正在研究 Angular 2 中的 DI。我正在使用通用子类型实现 REST 客户端,具体数据类型如下:
class RESTClient<T>{
constructor() {
var inj = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]);
this.http = inj.get(Http);
this.conf = RESTConfiguration;
}
}
class BookClient extends RESTClient<Book>{
constructor(){
// since I dont want to inject the HTTP Providers here, I'm using a custom injector in the super class
super();
}
}
class WriterClient extends RESTClient<Writer>{
...
...
}
据我了解,由超类 REST-Service 注入的所有 RESTClients 之间将共享一个 http 服务。
现在我想要一个这样的 RESTConfiguration 类:
@Injectable()
export class RESTConfiguration {
get baseURL() {
return this._baseURL;
}
set baseURL(value) {
alert("sets value to"+value);
this._baseURL = value;
}
private _baseURL;
}
应该在主应用中这样配置:
initializeApp(){
this.restconf.baseURL = "http://localhost:3004/";
}
bootstrap(MyApp, [RESTConfiguration]).then();
我现在想知道如何将我的 RESTConfiguration 的一个单例实例注入 RESTService 类而不将其传递给我希望保持无参数的构造函数,以减少代码重复并避免打字稿中的泛型问题。
在上面的示例(第一个代码 sn-p)中,我尝试使用我创建的 ReflectiveInjector 注入我的配置,它为我提供了我的配置的自定义实例。
我想了几个解决方案:
通过使用服务或某些静态类属性使应用程序“全局注入器”可用来访问应用程序“全局注入器”
在我的配置中实现额外的单例逻辑
找到在构造函数之外使用 angular-native 注入方法的方法?
我的想法有错误还是我滥用了 DI 框架?
【问题讨论】:
-
在阅读了上面的链接问题之后,我对作者很有感觉-我倾向于使用他的“肮脏的黑客”来让类通过全局注入器-我绝对不想重复代码在〜20-30班。有什么办法可以解决这个问题?如上所示,自定义注射器的方式如何?然后我可以直接将配置附加到我的服务或使其只是一个简单的静态类...
-
这会创建一个独立的注入器。此自定义注入器不会返回在任何模块中注册的提供程序以及为这些提供程序创建的实例。您可以按照链接问题的答案进行操作 - 传递 Angular2 应用程序的注入器并从该注入器获取服务。
-
是的,这行得通!那么这有多糟糕呢? (如果我没听错的话,你在上面的问题中称之为“肮脏的黑客”)。我认为这会限制子类的可测试性和可重用性?
-
它隐藏了使代码更难阅读的依赖关系。它违背了熟悉 Angular2 DI 工作原理的人的期望。它打破了生成静态代码以替换动态 DI 的离线编译,以提高性能并减少代码大小。
标签: angular typescript dependency-injection singleton