Angular 保存角度服务的单例实例的实践

Angular 保存角度服务的单例实例的实践,angular,dependency-injection,angular-services,Angular,Dependency Injection,Angular Services,当我第一次了解angular redux库时,我认为库中最吸引人的部分是@select装饰器,这意味着我不必每次从商店中选择时都注入商店服务 这让我想知道-装饰师是如何访问该服务的? 我研究了源代码,偶然发现了和代码 显然,初始化服务时会保存服务的静态实例,并且装饰程序会访问该实例 我想知道这种做法有多容易接受,因为我喜欢这个想法,并且我自己也用它为我的服务创建了装饰器和rxjs操作符,但是保存一个单身汉的想法对我来说还是很奇怪,感觉像是一个奇怪的黑客 同样,我希望您能对这种做法的可接受性提出意

当我第一次了解
angular redux
库时,我认为库中最吸引人的部分是
@select
装饰器,这意味着我不必每次从商店中选择时都注入
商店服务

这让我想知道-装饰师是如何访问该服务的?
我研究了源代码,偶然发现了和代码

显然,初始化服务时会保存服务的
静态实例
,并且
装饰程序
会访问该实例

我想知道这种做法有多容易接受,因为我喜欢这个想法,并且我自己也用它为我的服务创建了
装饰器
rxjs操作符
,但是保存一个单身汉的想法对我来说还是很奇怪,感觉像是一个奇怪的黑客

同样,我希望您能对这种做法的可接受性提出意见,以及是否有办法使用
Angular
依赖注入来避免这种情况


谢谢你的阅读

NgModules中定义的服务定义为惰性单例。这意味着,如果您不打算使用组件的
providers
部分覆盖服务,则可以安全地保存对服务实例的引用


主要缺点是可测试性问题,在这种情况下,为了方便使用,您必须为此付出代价。

我的问题不在于组件、指令、管道或服务,它们都是可注入的。我的问题在于angular之外的东西,比如
装饰器
,和
rxjs操作符
,人们用它们来定制自己的代码。我知道这种方法是有效的,它在我的代码中创造了奇迹,但我希望有一种更
DI
-y的方法来实现这一点。Angular的DI不提供任何类似于代理或拦截器的功能,也不支持属性注入,因此,不通过构造函数就不可能获得注入器引用或服务。这意味着您的服务必须使用factory才能使用decorator,并为使用decorator的每个服务提供一些管道。在自定义rxjs操作符中使用服务的唯一干净方法是直接将它们作为参数传递。因此,它是清洁设计和方便使用之间的折衷。