angular - 如何使用 Inject 获取一次服务实例

标签 angular angular2-services

如何使用 Injector 获得相同的单例服务实例:

我在引导应用程序上定义了此服务的提供者(对于所有应用程序上的一个实例)

示例:

引导应用程序

//Init application
bootstrap(AppComponent, [ROUTER_PROVIDERS, HTTP_PROVIDERS, SessionService]);

session 服务

单例 - 这只是示例,但实际上可以是 session 或 acl 服务

@Injectable()
export class SessionService {
    constructor() {
        console.warn("INSTANCE OF SESSION SERVICE-a");
    }
    public getInstance(instanceName: string){
        console.warn("Injected service come from component name: " + instanceName);
    }
}

SecureHomeComponent

当我在构造函数上注入(inject)服务时,只有一个服务实例(好)

@Component()
@CanActivate(AccessService.checkSession)
export class SecuredHomeComponent {
    public constructor(private testSessionService: SessionService) {
        this.testSessionService.getInstance('Component1:1'); //Test 1 - get the same instance when service is inject into contructor
    }
}

MyStaticService

我尝试这样,注入(inject)服务,但始终获取新的服务实例 但我需要使用“Injector.resolveAndCreate”直接注入(inject)静态方法,然后 NG2 创建新的服务实例(坏)

@Injectable()
export class MyStaticService {
    public static getDataFromService() {
        //That two ways is bad, bcs create new instance of my test SessionService
        //Test4
        let providers = Injector.resolve([ SessionService ]);
        let injectorFirst = Injector.fromResolvedProviders(providers);
        let testServFirst = injectorFirst.get(SessionService);
        testServFirst.getInstance('StaticService1:1');
        //Test 5
        let injectorSecond = Injector.resolveAndCreate([SessionService]);
        let testServSecond = injectorSecond.get(SessionService);
        testServSecond.getInstance('StaticService1:2');
    }
}

静态服务

对于真实的例子,我需要带有静态方法的静态类 如果我很好地理解文档,当想要覆盖注释的方法时 canActivate 必须提供静态方法的服务

行:我的“SecuredHomeComponent”中的@CanActivate(AccessService.checkSession)

//Static Service - ACCESS
@Injectable()
export class AccessService {
    public static checkAccess = (next: ComponentInstruction, prev: ComponentInstruction): boolean => {        
        return AccessService.checkSession() && AccessService.checkAcl(res, priv);
    }
    public static checkSession(): boolean {
        let injectedSessionServices: SessionService; //How to inject the same instance of my SessionService?
        return injectedSessionServices.getDataFromService(); //for real service he get back checkSession from sessionService
    }
    public static checkAcl(aclResource: AclResources, aclPrivilege: AclPrivileges): boolean {
        let injectedAclServices: SessionService; //How to inject the same instance of my SessionService?
        return injectedAclServices.checkAcl(aclResource, aclPrivilege);
    }
}

最佳答案

Angulars DI 为每个提供者保留一个实例。如果从同一个提供者请求一个实例,则每次都会返回相同的实例。

你可以做的是,提供一个工厂并调用该工厂来获取一个新实例。

bootstrap(AppComponent, [provide(CommonTestService, {useFactory: () => {
  return () => {
    new CommonTestService();
  }
})]);

如果服务本身有依赖项(构造函数参数),那么您也需要提供它们

bootstrap(AppComponent, [MyServiceDependency, provide(CommonTestService, {useFactory: () => {
  return () => {
    new CommonTestService(dep);
  },
  deps: [MyServiceDependency]
})]);

然后你就可以像这样使用它

@Component()
export class HomeComponent {
  public constructor(@Inject(CommonTestService) private testService:any) {
    let s1 = testService(); // new instance
    let s2 = testService(); // new instance
    ..
  }
}

关于angular - 如何使用 Inject 获取一次服务实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222799/

相关文章:

javascript - Typescript 交换数组项

angular - 如何使用 SystemJS/Angular2 通过 rxjs 访问 Rx.Scheduler.immediate?

javascript - 您可以在选项元素上设置点击事件吗? ( Angular v2.0.0-beta.0)

Angular 2 : which is the best way to make multiple sync calls with Observables?

angular - JWT token 中缺少 ADAL Angular2 appid(未经授权的响应)

angular - 如何防止在没有防护的情况下在 Angular 2 中导航

表单组对象绑定(bind)和验证的 Angular react 表单模块数组

javascript - Angular 2 中的类型 'subscribe' 不存在属性 'void'

javascript - 如何在普通 ES5 (Javascript) 中向 Angular 组件注入(inject)自定义服务?

javascript - Angular 翻译器不工作