SAP Spartacus HTTP Interceptor 的 provisioning 逻辑

简介: SAP Spartacus HTTP Interceptor 的 provisioning 逻辑

假import { Injectable } from ‘@angular/core’;

import {

HttpEvent, HttpInterceptor, HttpHandler, HttpRequest

} from ‘@angular/common/http’;


import { Observable } from ‘rxjs’;


/** Pass untouched request through to the next request handler. */

@Injectable()

export class NoopInterceptor implements HttpInterceptor {


intercept(req: HttpRequest, next: HttpHandler):

Observable<HttpEvent> {

return next.handle(req);

}

}



这个 NoopInterceptor 是由 Angular 的依赖注入 (DI) 系统管理的服务。 与其他服务一样,开发人员必须先提供拦截器类(Interceptor Class),然后应用才能使用它。
由于拦截器是 HttpClient 服务的可选依赖项(`optional dependencies`),因此必须在提供 HttpClient 的同一注入器或注入器的父级中提供它们。 DI 创建 HttpClient 后提供的拦截器将被忽略。
如果应用程序在应用程序的根注入器中提供 HttpClient,作为在 AppModule 中导入 HttpClientModule 的副作用,那么也应该在 AppModule 中提供拦截器。
从 `@angular/common/http` 导入 HTTP_INTERCEPTORS 注入令牌后,按照下列形式为 NoopInterceptor 提供 provider.
```typescript
{ provide: HTTP_INTERCEPTORS, useClass: NoopInterceptor, multi: true },


注意上面代码的 multi: true 选项。 这个设置告诉 Angular, HTTP_INTERCEPTORS 是一个用于注入一组值,而不是注入单个值的 多提供者的令牌。


考虑创建一个 barrel index 文件,将所有拦截器提供者的代码,收集到一个 httpInterceptorProviders 数组中。


这个 barrel index 文件的文件名为 index.ts, 内容如下:


/* "Barrel" of Http Interceptors */
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { NoopInterceptor } from './noop-interceptor';
/** Http interceptor providers in outside-in order */
export const httpInterceptorProviders = [
  { provide: HTTP_INTERCEPTORS, useClass: NoopInterceptor, multi: true },
];


然后我们在 App Module 里直接从 index.ts 里导入 httpInterceptorProviders 数组即可:


providers: [
  httpInterceptorProviders
],


下面我们看一看 Spartacus 的 SiteContextInterceptor 是如何被导入 NgModule 的。


发现它被导入一个名为 SiteContextOcc 的 module 之中。



在这个 module 里,我们使用了 useExisting 而非 useClass




useExisting 相当于 provider alias,即别名。


{provide: Class2, useExisting: Class2}


上面的代码并不会导致 Angular DI 框架主动为 Class2 创建实例。运行时如果构造函数请求 Class2 的实例,Angular DI 会为 key 为 Class2 的依赖,寻找另一个 provider,并从这个 Class2 提供者中取出注入实例。 开发人员可以把 useExisting 看成对另一个提供者或别名的引用。


相关文章
|
9月前
|
缓存
关于 Spartacus ProdutList Component Service model$ 的填充逻辑
关于 Spartacus ProdutList Component Service model$ 的填充逻辑
|
2月前
|
前端开发 搜索推荐 JavaScript
Spartacus Cart item 点击了 remove 之后 HTTP Delete 请求的触发逻辑 - Adapter
Spartacus Cart item 点击了 remove 之后 HTTP Delete 请求的触发逻辑 - Adapter
|
2月前
|
前端开发 搜索推荐 开发者
Spartacus empty cart 页面的显示逻辑
Spartacus empty cart 页面的显示逻辑
|
2月前
|
存储 消息中间件 搜索推荐
SAP Commerce Cloud Context Driven Services 的 clickStreamEvents HTTP 请求
SAP Commerce Cloud Context Driven Services 的 clickStreamEvents HTTP 请求
|
9月前
|
开发者
SAP ABAP 中,if_http_extension 接口的flow_rc 字段含义
SAP ABAP 中,if_http_extension 接口的flow_rc 字段含义
|
2月前
|
存储 Web App开发 JavaScript
关于 HTTP 请求头部自动添加的 cookie 字段的逻辑
关于 HTTP 请求头部自动添加的 cookie 字段的逻辑
|
9月前
|
Web App开发 JavaScript 前端开发
访问 SAP 电商云 Storefront 时遇到的 HTTP 403 错误
访问 SAP 电商云 Storefront 时遇到的 HTTP 403 错误
|
9月前
|
JSON Go 开发工具
Go语言学习 - RPC篇:理解标准库HTTP的hander实现逻辑
在Go语言中,常见的RPC包括HTTP/gRPC/Thrift等,但绝大多数的开发场景仍是基于HTTP。本文对RPC的讨论,主要是基于HTTP的场景。
43 0
|
9月前
|
前端开发
Spartacus 应用中 Lazy Loaded Module 初始化逻辑的实现方案
Spartacus 应用中 Lazy Loaded Module 初始化逻辑的实现方案
|
9月前
|
JavaScript 数据处理
combineLatest 操作符在 Spartacus Cost Center 计算逻辑中的一个实际应用
combineLatest 操作符在 Spartacus Cost Center 计算逻辑中的一个实际应用