Angularjs 我应该为我的$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,

我需要为$http服务实现一个拦截器。我尝试了两种使用工厂和服务的实现,它们都可以正常工作。这是类型脚本中的实现:

服务

 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
调用它们