角度依赖注入沙盒分别将每个组件

时间:2018-12-17 17:12:34

标签: angular

我有一个基于组件继承的体系结构 基类提供了许多有用的方法和属性 其中某些功能需要引用服务 如果我在构造函数上使用DI,那么我最终需要将许多(10+)参数传递给我制作的每个组件上的基类。 为了避免这种情况,我有一个名为ServiceBag的服务,其中已注入了所有服务,并将其注入了所有组件-这样,我只需要将一个变量传递给super()即可。

默认情况下,将为此ServiceBag创建一个单例,然后将其传递给所有组件。只要内部的所有服务也是单例并且实例化一次,就可以。

我现在遇到的情况是,它们中的一些作用域仅限于该组件,因此,如果我只有1个ServiceBag实例,则显然无法正常工作。

底线- 我想在我的组件树的任何级别上为每个组件实例创建一个新的ServiceBag实例。我可以将其放在提供程序中:我拥有的每个组件的[ServiceBagService],并且可以工作-但对我而言这没有意义-必须有更好的方法来实现。自定义注入器,装饰器或类似的东西,将导致它每次创建一个新实例

此方法与根级别提供的服务配合使用。

1 个答案:

答案 0 :(得分:0)

我通过扩展@Component装饰器解决了它:

import { Component } from '@angular/core';
import { ServiceBagService } from './ServiceBag';

/*
 * The decorator causes the ServiceBag to instanciate every time a new component is created
 * It should be used on all components that inherit from ComponentBase to provide the correct ServiceBag instance to the component
  */

function ComponentEx(args: any = {}): (cls: any) => any
{
    args.providers = [ServiceBagService];
    return Component(args);
}

export default ComponentEx;