Angularjs 我应该为我的$http拦截器使用服务还是工厂
我需要为$http服务实现一个拦截器。我尝试了两种使用工厂和服务的实现,它们都可以正常工作。这是类型脚本中的实现: 服务:Angularjs 我应该为我的$http拦截器使用服务还是工厂,angularjs,typescript,Angularjs,Typescript,我需要为$http服务实现一个拦截器。我尝试了两种使用工厂和服务的实现,它们都可以正常工作。这是类型脚本中的实现: 服务: export class AuthInterceptorService { private _authService:Services.IAuthService; static $inject = ['$q', '$location', '$injector']; constructor(private $q: ng.IQService,
export class AuthInterceptorService {
private _authService:Services.IAuthService;
static $inject = ['$q', '$location', '$injector'];
constructor(private $q: ng.IQService, private $location: ng.ILocationService, private $injector: ng.auto.IInjectorService) {
}
private getAuthService = (): Services.IAuthService=> {
if (this._authService == null) {
this._authService = this.$injector.get('authService');
}
return this._authService;
}
public request = (config: ng.IRequestConfig) => {
config.headers = config.headers || {};
var authData = this.getAuthService().authData;
if (authData) {
config.headers.Authorization = 'Bearer ' + authData.token;
}
return config;
}
public responseError = (rejection)=> {
if (rejection.status === 401) {
this.getAuthService().logOut();
}
return this.$q.reject(rejection);
}
}
export function AuthInterceptorFactory($q: ng.IQService, $injector: ng.auto.IInjectorService) {
return {
request: (config: ng.IRequestConfig)=> {
config.headers = config.headers || {};
var authData = $injector.get('authService').authData;
if (authData) {
config.headers.Authorization = 'Bearer ' + authData.token;
}
return config;
},
responseError: (rejection)=> {
if (rejection.status === 401) {
$injector.get('authService').logOut();
}
return $q.reject(rejection);
}
};
}
应用程序内初始化:
.service('authInterceptorService', Services.AuthInterceptorService)
.factory('authInterceptorFactory', ['$q', '$injector', Services.AuthInterceptorFactory])
工厂:
export class AuthInterceptorService {
private _authService:Services.IAuthService;
static $inject = ['$q', '$location', '$injector'];
constructor(private $q: ng.IQService, private $location: ng.ILocationService, private $injector: ng.auto.IInjectorService) {
}
private getAuthService = (): Services.IAuthService=> {
if (this._authService == null) {
this._authService = this.$injector.get('authService');
}
return this._authService;
}
public request = (config: ng.IRequestConfig) => {
config.headers = config.headers || {};
var authData = this.getAuthService().authData;
if (authData) {
config.headers.Authorization = 'Bearer ' + authData.token;
}
return config;
}
public responseError = (rejection)=> {
if (rejection.status === 401) {
this.getAuthService().logOut();
}
return this.$q.reject(rejection);
}
}
export function AuthInterceptorFactory($q: ng.IQService, $injector: ng.auto.IInjectorService) {
return {
request: (config: ng.IRequestConfig)=> {
config.headers = config.headers || {};
var authData = $injector.get('authService').authData;
if (authData) {
config.headers.Authorization = 'Bearer ' + authData.token;
}
return config;
},
responseError: (rejection)=> {
if (rejection.status === 401) {
$injector.get('authService').logOut();
}
return $q.reject(rejection);
}
};
}
应用程序内初始化:
.service('authInterceptorService', Services.AuthInterceptorService)
.factory('authInterceptorFactory', ['$q', '$injector', Services.AuthInterceptorFactory])
然后在拦截器的配置上:
.config(['$httpProvider', ($httpProvider:ng.IHttpProvider) => {
$httpProvider.interceptors.push('authInterceptorxxxxx');
}])
如您所见,我使用服务位置模式来注入依赖项(使用$injector),这是为了避免循环依赖项,因为注入的服务依赖于$http
正如我所说的,它们都可以工作,我更喜欢服务版本,因为它允许我缓存依赖服务“authService”的注入,在工厂风格中,它在每次请求时都得到解析和注入。在使用服务实现时是否存在任何问题?在Angular docs中,他们建议您应该使用工厂。为HttpInterceptor使用服务没有什么错。Angular只需调用injector.get即可解决此问题,因此使用服务也可以 从源代码
$injector.get(拦截器工厂)
:
指令也是如此吗?我记得你的一篇帖子说我们应该使用函数而不是类来执行指令,以防止被上下文所欺骗使用函数执行指令,因为angular(如工厂)不会用
new
调用它们